Python Tkinter 菜单栏不显示

Posted

技术标签:

【中文标题】Python Tkinter 菜单栏不显示【英文标题】:Python Tkinter menu bars don't display 【发布时间】:2013-03-12 22:27:35 【问题描述】:

我正在尝试使用 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()

【问题讨论】:

您的示例从不创建 self.master,这是您的实际代码吗? 感谢您的回复!这实际上不是我的代码,它是我正在使用的教程之一中的其他人的代码,但他们都遇到了同样的问题,所以我认为最好粘贴这个。我将编辑我的帖子以包含我的帖子。 另外,你是对的,我没有注意到 self.master - 猜它是匆忙写的!如果我放了一个 root=Tk(),把 root 作为 App 的 init 的一个参数(并把它输入到最后一行),把一个 self.master=root 立即放入 init 并将 root.mainloop() 放在脚本末尾,我仍然发现相同的结果... @user2163043 你能发一下教程吗?我假设它是在线的,它将极大地帮助我们帮助您。 @user2163043 已解决。有趣的问题 - 我在哪里可以找到更多关于 Menu 的信息?另外,如果我的回答有帮助,请点击旁边的绿色复选标记。这将帮助其他人认识到这可能会有所帮助。 【参考方案1】:

根据您对其中一个答案所做的一些 cmets,您显然是在 Macintosh 上运行它。代码工作正常,但菜单出现在 mac 菜单栏中,而不是像在 Windows 和 Linux 上那样出现在窗口上。因此,就菜单栏而言,您的代码没有任何问题。

【讨论】:

正确,但在您发布此内容之前,其他答案的 cmets 中也提到了这一点。 还是+1,因为这就是答案(有同样的问题) 天啊!我现在觉得好傻。我可能永远不会习惯使用 Mac!非常感谢您指出显而易见的事情。【参考方案2】:

带说明的代码

根据个人经验,我发现在一个小部件方法中管理所有小部件通常更容易。这就是我在这里所做的,它奏效了。另外,我使用了master,而不是父级。我现在将逐步引导您完成代码。

from Tkinter import *

我们导入 Tkinter(GUI 的东西)

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启动GUI的主循环。

【讨论】:

@user2163043 如果我的回答对你有帮助,请给我绿色的复选标记。它将帮助其他人看到这是一个很好的答案。如果没有,请用我的回答告诉我问题所在。 哇,您好,感谢您的回答!奇怪的是,当我运行它时,我实际上根本没有弹出 gui - python 启动器运行,但没有打开任何窗口。但是,如果我在 root.title 之后放置一个 root.geometry("250x300+300+300") ,它的作用与以前相同 - 显示一个空的白框(这一行也在我的原始代码中 - 抱歉忘记了提到它,现在已经编辑了我的问题)。很奇怪。教程在这里:skriticos.blogspot.co.uk/2009/07/…。感谢您的帮助! @user2163043 我也有一个mac——我也会在那里运行程序。所以...菜单栏是否显示?它对我来说效果很好......可能发生的情况是 Mac 菜单栏显示在上栏中,苹果标志旁边的区域和您的程序名称。那,实际上几乎可以肯定发生了什么。 Ahhhhh 好的,我现在觉得很愚蠢,是的,事情就是这样!菜单一直都在那里,但在拥有 Mac 4 年后,我仍然没有想到在 OS X 菜单栏中寻找它。伟大的。非常感谢您的帮助,否则我绝对不会找到它! @user2163043 是的 - 所以很棒。自从我加入以来,我学到了很多东西。尝试回答一些问题——通常你从回答中学到的东西多于提问。无论如何,祝你的项目好运。【参考方案3】:

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

我认为正在发生的事情是某些特定于 mac 的修复程序正在更改事件代码,因此某些菜单项最终会出现在 Python 菜单项下,而不是预期的位置,我在自己的实验中看到了其中的一些。当我扩展我的代码并使用一些保留的 FILE 事件代码而不是标准事件代码时,事情变得更好了。

#!/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()

【讨论】:

【参考方案4】:

如果您正在执行任何涉及您希望查看或测试的菜单栏的 GUI,请检查您的 mac 菜单栏。它很微妙,您可能认为您的代码无法正常工作。单击应用程序(在本例中为 python 窗口),它将显示一个下拉菜单栏。

【讨论】:

以上是关于Python Tkinter 菜单栏不显示的主要内容,如果未能解决你的问题,请参考以下文章

菜单栏不工作

Navicat Premium 打开以后菜单栏不显示内容 ,重装了还是这样。

eclipse菜单栏不显示 + the system is running in lou-graphics mode问题

c#第二个状态栏不显示信息

Bootstrap 4动画导航栏不显示

Python Tkinter:在状态栏中显示描述