Python Tkinter 菜单栏不显示

5 投票
5 回答
20996 浏览
提问于 2025-04-17 18:52

我正在尝试使用Tkinter制作一个图形用户界面(GUI),现在想要实现一个菜单栏。我看了一些教程,也写了一些代码,但菜单栏似乎总是没有出现,只显示一个白色背景的空框。这种情况不仅仅发生在我的代码上;即使我把其中一个教程的代码复制粘贴到一个新的脚本中,结果也是一样。

如果有人能帮我找出问题所在,我将非常感激。我的系统是OS X 10.5,使用的是Python 2.7和Tk 8.4。这里是那个看起来不工作的教程代码:

#!/usr/local/bin/python2.7

from Tkinter import *
from ttk import *

class App(Frame):
    def __init__(self):
            Frame.__init__(self)

            self.master.geometry('400x300')
            self.master.title(__file__)

            self.pack()

            self.menu = Menu(tearoff=False)
            self.master.config(menu = self.menu)

            fm = self.file_menu = None
            fm = Menu(self.menu, tearoff=False)
            self.menu.add_cascade(label='File', menu = fm)

            fm.add_command(label='Say Hello', command = self.say_hello)
            fm.add_separator()
            fm.add_command(label='Quit', command = self.quit)

            self.mainloop()

    def say_hello(self, *e):
            self.label = Label(self.master, text='Hello there!')
            self.label.pack(anchor=CENTER, fill=NONE, expand=YES, side=LEFT)

if __name__ == '__main__':
    App()

而我的代码在这里:

from Tkinter import *

class App(Frame):

    def __init__(self, parent):
        Frame.__init__(self, parent)

        parent.title("Cluedo Solver 1.0")

        menubar = Menu(root)
        menubar.add_command(label="File")
        menubar.add_command(label="Quit", command=root.quit())

        root.config(menu=menubar)

root=Tk()
root.geometry("300x250+300+300")
app=App(root)
root.mainloop()

5 个回答

1

我在尝试上面的代码,但在macOS的菜单栏上只看到“Python”,而且是它常见的下拉菜单。tkinter在macOS 10.14.1上似乎无法正常显示菜单。

我觉得发生的情况是,有一些特定于mac的修复措施正在改变事件代码,导致某些菜单项出现在Python菜单项下,而不是预期的位置。我在自己的实验中也发现了一些这种情况。当我扩展我的代码并使用一些保留的文件事件代码,而不是标准的代码时,效果要好一些。

#!/Library/Frameworks/Python.framework/Versions/3.7/bin/python3.7
# -*- coding: utf-8 -*-# -*- coding: utf-8 -*-

from tkinter import *

class App(Frame):
    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.widgets()

    def widgets(self):
        menubar = Menu(root)
        menubar.add_command(label = 'File')
        menubar.add_command(label = 'quit', command = root.quit())
        root.config(menu = menubar)

root = Tk()
root.title('Menubar')
app = App(root)
root.mainloop()
22

根据你在某个回答下的评论,你似乎是在Mac电脑上运行这个程序。代码本身没有问题,但是菜单会出现在Mac的菜单栏里,而不是像在Windows和Linux上那样出现在窗口里。所以,从菜单栏的角度来看,你的代码没有任何错误。

4

代码与解释

根据我的个人经验,我发现把所有的控件放在一个叫“widgets”的方法里管理,通常会更简单。这就是我在这里做的,而且效果很好。此外,我用的是“master”而不是“parent”。接下来,我会一步一步带你了解这段代码。

from Tkinter import *

我们导入Tkinter(用于图形界面的东西)

class App(Frame):

我们创建一个叫做 App 的类,这个类是一个 Frame,用来放置控件。

    def __init__(self, master):
        Frame.__init__(self, master)
        self.grid()
        self.widgets()

我们创建一个叫 __init__ 的方法。这个方法用来初始化这个类,并且运行另一个叫 widgets 的方法。

    def widgets(self):


        menubar = Menu(root)
        menubar.add_command(label="File")
        menubar.add_command(label="Quit", command=root.quit())

        root.config(menu=menubar)

我们创建了 widgets 方法。在这里,我们添加了一个控件,叫 menubar。如果我们还要创建其他控件,也会在这里添加。

root=Tk()
root.title("Menubar")
app=App(root)
root.mainloop()

最后,我们给整个窗口设置一些属性。我们给它一个标题,叫 Menubar,然后运行 App 类。最后,我们用 root.mainloop 启动图形界面的主循环。

撰写回答