Панель меню Python Tkinter не отображается - PullRequest
0 голосов
/ 01 октября 2018

У меня есть следующий код, который не отображает меню.Это работало, пока я не переместил меню в класс.Я добавил 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()

1 Ответ

0 голосов
/ 01 октября 2018

Проблема в том, что MainMenu наследуется от Menu, но также создает внутреннее меню, в котором есть все остальные пункты меню.Вы присоединяете MainMenu к корневому окну, но вы подключили все каскадные меню к скрытому меню self.menubar.

Другими словами, вам необходимо добавить свои каскадные меню к selfвместо self.menubar, и вам вообще не нужно создавать self.menubar.

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.add_cascade(label="File", menu=self.file_menu(self))
        self.add_cascade(label="Settings", menu=self.settings_menu(self))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...