按下plot-Button后,cx_freeze转换的GUI-app(tkinter)崩溃

Pus*_*keL 10 python tkinter matplotlib cx-freeze python-3.x

我几天来一直在处理这个问题,希望得到一些帮助.我开发了一个带有导入模块的GUI应用程序tkinter,numpy,scipy,matplotlib,它在python本身运行良好.转换为*.exe后,一切都按预期工作,但不是matplotlib部分.当我按下我定义的情节按钮时,*.exe只会关闭并且不显示任何情节.所以我想做一个简约的例子,我简单地绘制一个sin函数并且我面临同样的问题:在python中完美工作,当将它转换为*.exe时,它在按下情节按钮时崩溃.简约的例子在这里:

import tkinter as tk
import matplotlib.pyplot as plt
import numpy as np

class MainWindow(tk.Frame):
    def __init__(self):
        tk.Frame.__init__(self,bg='#9C9C9C',relief="flat", bd=10)
        self.place(width=x,height=y)
        self.create_widgets()

    def function(self):
        datax = np.arange(-50,50,0.1)
        datay = np.sin(datax)
        plt.plot(datax,datay)
        plt.show()

    def create_widgets(self):
        plot = tk.Button(self, text='PLOT', command=self.function)
        plot.pack()


x,y=120,300
root=tk.Tk()
root.geometry(str(x)+"x"+str(y))
app = MainWindow()
app.mainloop()
Run Code Online (Sandbox Code Playgroud)

并查看我的相应"setup.py"以使用cx_freeze进行转换.

import cx_Freeze
import matplotlib
import sys
import numpy
import tkinter

base = None

if sys.platform == "win32":
    base = "Win32GUI"

executables = [cx_Freeze.Executable("test.py", base=base)]


build_exe_options = {"includes":   ["matplotlib.backends.backend_tkagg","matplotlib.pyplot",
                             "tkinter.filedialog","numpy"],
                     "include_files":[(matplotlib.get_data_path(), "mpl-data")],
                     "excludes":[],
                    }

cx_Freeze.setup(
    name = "test it",
    options = {"build_exe": build_exe_options},
    version = "1.0",
    description = "I test it",
    executables = executables)
Run Code Online (Sandbox Code Playgroud)

任何可能解决问题的想法都受到高度赞赏.我正在使用64位Windows10机器,而我正在使用带有Python 3.4.3的WinPython发行版.

J.J*_*ala 29

在使用相同的test.py测试PyInstaller时,我发现了这个问题的潜在解决方案(或至少是解释).我收到有关dll文件丢失的错误消息,该文件是mkl_intel_thread.dll.

我搜索了那个文件,它被发现在numpy文件夹里面.我将匹配mkl _*.dlllibiomp5md.dll的文件复制到test.exe创建的同一目录python setup.py build.在此之后,最小的test.exe在按下绘图按钮时显示了matplotlib窗口.

这些文件位于lib\site-packages \numpy\core文件夹中.

  • 我正在使用Anaconda,DLL不在lib/site-packages/numpy/code文件夹中.相反,我在Anaconda/Library/bin中找到了它们. (4认同)

Has*_*oto 5

我真的想发布这个评论,但我没有声誉.这主要是JJ Hakala关于如何找到原因的答案的后续行动.

如果将基数更改为"控制台",即使用

base = "Console"

而不是

base = "Win32GUI"

程序启动时也会弹出控制台并打印此错误

Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll.

这有助于更快地找到问题的原因.

我认为这值得一提,因为这个技巧也有助于诊断其他问题.在最终版本中,可以恢复到Win32GUI以避免额外的控制台.我应该给这个其他stackoverflow帖子的学分