#python #matplotlib #tkinter #cx-freeze #tkmessagebox
#python #matplotlib #tkinter #cx-замораживание #tkmessagebox
Вопрос:
Я создал графический интерфейс tkinter, позволяющий пользователю выбирать csv-файлы и генерировать графики с помощью matplotlib. Эта программа хорошо работает в моей IDE, но закрывается после создания одного графика в моем замороженном исполняемом файле (cx_freeze). EXE запускается без ошибок — он выводит график в редакторе фотографий по умолчанию, а затем отображает всплывающее окно с указанием пути к файлу диаграммы. Когда всплывающее окно (tx.messagebox) закрывается, главное окно также закрывается, и программу необходимо перезапустить.
Желаемое поведение заключается в том, чтобы главное окно оставалось открытым, позволяя пользователю создавать дополнительные графики. Ниже приведена урезанная версия моего кода. Кто-нибудь знает, что может вызвать закрытие главного окна после принятия messagebox?
from pathlib import Path
from tkinter import Tk
from tkinter import Frame
from tkinter import Button
from tkinter import filedialog
import tkinter.messagebox as messagebox
import os
import traceback
import matplotlib.pyplot as plt
class graphing_program(Tk):
def __init__(self,*args, **kwargs):
Tk.__init__(self, *args, **kwargs)
self.window_width = 300
self.window_height = 150
self.geometry(f"{str(self.window_width)}x{str(self.window_height 20)} 300 300")
container = Frame(self)
container.place(width=self.window_width,height=self.window_height)
self.wm_title('Graphing Program')
self.button = Button(self, text="Select Files",
command= self.open_file)
self.button.place(relwidth = 1,relheight = 1,relx=0,rely=0)
#%% Variables
self.data_dir = Path('.')
def open_file(self):
try:
temp_files = filedialog.askopenfilenames(initialdir = self.data_dir,title = "Select File",filetypes = (("csv","*.csv"),("all files","*.*")))
savefn = lp.plot_data(temp_files)
os.startfile(savefn)
messagebox.showinfo('Chart Generated',f'Chart Path:nt{savefn}')
except:traceback.print_exc();raise
class lp():
def plot_data(file_paths):
savefn = Path('./example_graph.png')
x = [1,2,3,4,5,6,7,8,9,10]
y = [1,2,3,4,5,6,7,8,9,10]
fig1 = plt.figure(figsize=[7.5,10])
plt.plot(x,y,'-',color = 'r')
fig1.savefig(fname= savefn,format="png")
plt.close(fig1)
return(savefn)
if __name__ == "__main__":
app = graphing_program()
app.mainloop()
Комментарии:
1. Вы запускаете программу из файлового браузера или командной строки?
2. TigerhawkT3 — Я запускаю программу из ярлыка на рабочем столе, созданного cx_freeze bdist_msi.
3. Вручную запустите этот ярлык из командной строки (эмулятор терминала). При сбое ошибка все равно будет отображаться в окне командной строки. Если вы этого не сделаете, отображается ошибка, но окно немедленно закрывается, поэтому вы не можете исследовать проблему.
4. TigerhawkT3 — Программа выполняется без ошибок из командной строки. Перезапуск программы для нового графика — лишь незначительное неудобство, но мне любопытно, почему это происходит. Возможно, это не заслуживает глубокого изучения.