Меню Tkinter не отображается в macOS 11.2.2

#python #tkinter #tkinter-menu

#питон #tkinter #tkinter-меню

Вопрос:

Я пытаюсь создать приложение для отображения данных в режиме реального времени в исследовании электрических систем. Меню будет использоваться для открытия информации об истории каждого из графиков, показанных на «главной странице», а также будет включать опцию выхода. Когда я создаю меню и добавляю в него пару пунктов, оно не отображается при запуске приложения. К сожалению, в моих поисках все альтернативы, которые я пробовал, тоже не появляются.

 from tkinter import *
from tkinter import ttk


class PicoGridInterfacing(Frame):
    def __init__(self, master=None):
        super().__init__(master)
        self.master = master
        self.grid()
        menubar = Menu(root)
        menu = Menu(menubar)
        menubar.add_cascade(label="Menu", menu=menu)
        menu.add_command(label="History", command=None)
        menu.add_command(label="Quit", command=root.quit)

        batteryData = Frame(root)
        batteryData.grid(row=1, column=0)
        Label(batteryData, text="Hello!").grid()


root = Tk()
root.title("Electric Power Systems Lab Pico Grid Interfacing")
app = PicoGridInterfacing(master=root)
root.mainloop()
 

Вот скриншот результата, который я вижу:
Скриншот вывода

Любая помощь будет с благодарностью принята, спасибо!

Комментарии:

1. Я не понимаю, что именно вы пытаетесь сделать. Вы пытаетесь создать выпадающее меню? Не могли бы вы сказать мне, что именно вы хотите, чтобы программа выполняла?

2. @TheLizzard Извиняется, я впервые использую stack. Я пытаюсь создать выпадающее меню в Tkinter. На данный момент в меню будет только заполнитель для просмотра истории данных и возможность выхода из приложения. Само приложение используется для исследования, чтобы показать графики. Вот ссылка на макет того, как я хотел бы, чтобы выглядел графический интерфейс — imgur.com/a/W7JMZOL

3. На самом деле вы никогда не прикрепляли панель меню к окну — было бы что-то вроде root.config(menu=menubar) .

4. @jasonharper Вот и все! Не могу поверить, что я, должно быть, пропустил это при просмотре руководств большое вам спасибо!

Ответ №1:

Попробуйте это:

 from tkinter import *
from tkinter import ttk


class PicoGridInterfacing(Frame):
    def __init__(self, master=None):
        super().__init__(master)

        # master = master # `super().__init__(master)` already does that so its useless

        # Creating the menu
        menubar = Menu(root)
        menu = Menu(menubar, tearoff=False)
        menubar.add_cascade(label="Menu", menu=menu)
        menu.add_command(label="History", command=None)
        menu.add_command(label="Quit", command=root.destroy)

        # Tell the `Tk()` that there is a menu that it need to display:
        master.config(menu=menubar)

        batteryData = Frame(self)
        batteryData.grid(row=1, column=0)
        Label(batteryData, text="Hello!").grid()


root = Tk()
root.title("Electric Power Systems Lab Pico Grid Interfacing")
app = PicoGridInterfacing(master=root)
# When you inherit from `Frame` you always what the user to call `.grid`
app.grid()
root.mainloop()
 

Вам нужно сообщить tkinter.Tk() , что есть меню, иначе оно его проигнорирует. Также при наследовании от tkinter.Frame вызывающего абонента вызывается вызов .grid (это соглашение).

Комментарии:

1. Этот ответ был бы лучше, если бы вы добавили объяснение. В противном случае нам придется сравнивать ваш код с исходным построчно и посимвольно, чтобы увидеть, что вы изменили.

2. @BryanOakley Я подумал, что комментариев было достаточно. Я объясню до конца. Спасибо за предложение.

Ответ №2:

Вам необходимо прикрепить строку меню к корневому окну.

Итак, сделайте это: root.config(menu=menubar)

Комментарии:

1. В следующий раз, пожалуйста, предоставьте немного кода, чтобы показать OP, как это сделать.