Программа Tkinter автоматически закрывается без ошибок после закрытия окна сообщения

#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 — Программа выполняется без ошибок из командной строки. Перезапуск программы для нового графика — лишь незначительное неудобство, но мне любопытно, почему это происходит. Возможно, это не заслуживает глубокого изучения.