У меня есть следующий код, который не отображает меню.Это работало, пока я не переместил меню в класс.Я добавил self.configure(menu=self.menu)
на основе этого вопроса , но он все еще не работает.Операторы печати показывают, что код построения меню выполняется.
Правильно ли я получаю ссылку на родительский элемент?
Если я ошибочно ссылаюсь на обработчики событий из родительского элемента вместо контроллера,ошибка означает, что это объект Tk ().
Я использую python3.6 и tkinter8.6 в Ubuntu.
import tkinter as tk
class App(tk.Tk):
def __init__(self, *args, **kwargs):
tk.Tk.__init__(self, *args, **kwargs)
self.main = MainWindow(self)
self.menu=MainMenu(self, self.main)
self.configure(menu=self.menu)
self.minsize(300,300)
self.geometry("500x500")
self.protocol('WM_DELETE_WINDOW', self.main.on_exit)
self.main.pack(fill="both", expand=True)
class MainWindow(tk.Frame):
def __init__(self, parent, *args, **kwargs):
tk.Frame.__init__(self, parent, *args, **kwargs)
self.parent = parent
def on_exit(self):
print("exiting...")
self.parent.destroy()
def on_choose_port(self):
print("on_choose_port selected")
class MainMenu(tk.Menu):
def __init__(self, parent, controller):
tk.Menu.__init__(self, master=None)
self.master = parent
self.controller = controller
print("building menu bar")
self.menubar = tk.Menu(self.master)
self.menubar.add_cascade(label="File", menu=self.file_menu(self.menubar))
self.menubar.add_cascade(label="Settings", menu=self.settings_menu(self.menubar))
def file_menu(self, parent):
print("building file menu...")
file_menu = tk.Menu(parent)
file_menu.add_command(label="Exit", command=self.controller.on_exit)
return file_menu
def settings_menu(self, parent):
print("building settings menu...")
settings_menu = tk.Menu(parent)
settings_menu.add_command(label="Port", command=self.controller.on_choose_port)
return settings_menu
if __name__ == "__main__":
App().mainloop()