CX freeze converted GUI-app (tkinter) аварийно завершает работу после нажатия кнопки plot
Я имею дело с этим в течение нескольких дней и надеюсь найти некоторую помощь. Я разработал GUI-приложение с импортированными модулями tkinter, numpy, scipy, matplotlib, которое отлично работает в самом python. После преобразования в *.exe все работает так, как ожидалось, но не раздел matplotlib. Когда я нажимаю свою определенную кнопку plot-Button,*.exe просто закрывается и не показывает никаких сюжетов. Поэтому я подумал сделать минималистичный пример, где я просто рисую функцию греха, и я сталкиваюсь с тем же вопрос: Работает идеально в python, при преобразовании его в *.exe он падает при нажатии кнопки plot. Минималистичный пример здесь:
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()
и увидеть мой соответствующий "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)
любые идеи, которые могут решить эту проблему, высоко ценятся. Я работаю на 64-битной машине Windows10, и я использую дистрибутив WinPython с Python 3.4.3.
2 ответов
Я нашел потенциальное решение (или, по крайней мере, объяснение) для этой проблемы при тестировании PyInstaller с тем же test.py. Я получил сообщение об ошибке о том, что файл dll отсутствует, этот файл mkl_intel_thread.dll файлы.
Я искал этот файл и он был найден внутри включает в себя. Я скопировал файлы, соответствующие mkl_*.dll файлы и libiomp5md.dll файлы в тот же каталог, где .
файлы находились в папке lib\site-packages\numpy\core.
Я действительно хотел опубликовать это как комментарий, но у меня нет репутации. Это в основном продолжение ответа J. J. Hakala о том, как найти причину.
если изменить базу на "консоль", то есть с помощью
base = "Console"
, а не
base = "Win32GUI"
консоли также появится при запуске программы и эта ошибка печати
Intel MKL FATAL ERROR: Cannot load mkl_intel_thread.dll.
, который может помочь найти причину проблемы довольно быстрее.
Я думал, что это стоит упомянуть, так как этот трюк также может быть полезен для диагностики других проблем. В финальном выпуске можно вернуться к Win32GUI, чтобы избежать дополнительной консоли. Я должен отдать должное этому другому сообщение stackoverflow