Не знаю, как применить mainl oop () в моем приложении - PullRequest
0 голосов
/ 08 июля 2020

Я запрограммировал приложение на 2600 строк, которое отлично работало при запуске из IDE. Теперь я создал исполняемый файл через Pyinstaller, и теперь GUI не запускается. Приложение запускается и быстро исчезает. Ошибок не получаю (больше решил, решил), но проблема осталась. Я думаю, что это связано с отсутствием mainloop() в моем приложении, что я не знаю, как применить в данном конкретном случае. Обычно это так:

root = tk.Tk()
root.mainloop()

В моем случае я создал класс для своего окна, добавив строку меню и метку как строку состояния ( последнее не показано в моем коде ниже ). Это заставляет меня назначать этот класс как Tk () на main_window. Куда мне поместить mainloop() без получения ошибки?

Я уже пробовал: main_window.mainloop(), поскольку main_window - это окно, в которое помещаются все фреймы, но затем я получаю следующую ошибку в среде IDE: main_window.mainloop() AttributeError: 'AppWindow' object has no attribute 'mainloop'

Как мне применить mainl oop () в моем приложении, чтобы не получить вышеупомянутую ошибку? Или как заставить мой GUI работать по-другому? Оба ответа приветствуются.

Вот код, который необходимо знать:

import tkinter as tk

class AppWindow():
    def __init__(self, master):
        self.master = master
        master.title("Basic Application")
        master.geometry("1060x680")
        master.grid_propagate(False)
        
        #create drop down menu
        self.menubar = tk.Menu(master) # main menubar
        
        #Add filemenu
        self.filemenu = tk.Menu(self.menubar, tearoff=0) #sub menu
        
        self.filemenu.add_separator() #create a bar in the menu
        self.filemenu.add_command(label="Quit", command=master.destroy) #Add submenu item
        self.menubar.add_cascade(label="File", menu=self.filemenu) #Add submenu to menubar
        
        self.master.config(menu=self.menubar) #Show menu


class FrameOne(tk.Frame):
    def __init__(self, parent):
        super().__init__()
        self["borderwidth"]=5
        self["relief"]="ridge"
                                      
        self.create_widgets() #Function which creates all widgets
        self.position_widgets() #Function which position all widgets
        
        
    def create_widgets(self): #Function which creates all widgets
        pass
    
    def position_widgets(self): #Function which position all widgets
        pass


#Create a window as defined in the AppWindow class
main_window = AppWindow(tk.Tk()) 

#Create a Frame as defined in class FrameOne
first_frame = FrameOne(main_window)
first_frame.grid(row=0, column=0) #Positioning Frame on Window

main_window.mainloop() #THIS PROVIDES AN ERROR | GUI DOES NOT START WITHOUT

1 Ответ

0 голосов
/ 08 июля 2020

mainloop - это метод окна tkinter root и самого tkinter. Как говорится в ошибке, это не метод вашего класса AppWindow.

В вашем случае вы должны сделать это так:

root = tk.Tk()
main_window = AppWindow(root)
root.mainloop()
...