【问题标题】:Python Tkinter Menubutton with radiobutton drop-down带有单选按钮下拉菜单的 Python Tkinter 菜单按钮
【发布时间】:2018-09-16 22:17:24
【问题描述】:

我一直在深入研究 Python 3/Tkinter,并希望在框架内创建一个菜单按钮,单击该按钮时,将下拉一个带有单选按钮的选项列表。理想情况下,我想为我的单选按钮设置 indicatoron=0,但我的代码遇到了一个问题,即菜单按钮不会出现在应用程序窗口中。我看过的所有指南都展示了在菜单栏下设置单选按钮列表或创建带有复选按钮选项列表的菜单按钮的能力。

当您运行此代码时,它会提示一个带有“最小化 - 展开 - 关闭”按钮的空窗口。展开应用程序窗口后,不会显示任何内容。

from tkinter import *

class TestMenu:
        def __init__(self, master):
            self.master = master
            self.menubar = Menubutton(self.master, text='Menubutton', relief=RAISED,
                                    activebackground='#3399ff', bg='white', fg='black')
            mbmenu = Menu(self.menubar, tearoff=0)
            mb_radmenu = Menu(mbmenu)

            mb_radmenu.add_radiobutton(label='A')
            mb_radmenu.add_radiobutton(label='B')
            mb_radmenu.add_radiobutton(label='C')

            mbmenu.add_cascade(menu=mb_radmenu)
            self.top = Toplevel(menu=self.menubar, width=200, relief=RAISED, borderwidth=2)

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

【问题讨论】:

  • 您说您想在框架中创建一个按钮,但是您尝试将该按钮添加为窗口的菜单。你想做什么?你想要一个传统的菜单栏,还是一个按钮?
  • 就是这样,我不想要传统的菜单栏,只需要一个按钮。我觉得奇怪的是我之前使用带有检查按钮的单个按钮创建的代码使用了 Menu() 函数。我想这就是混乱所在。

标签: python-3.x tkinter


【解决方案1】:

您的代码有很多问题。

  • 您不能使用Menubutton 作为menu 选项的值——它必须是Menu 的实例。

  • 您正在创建 self.menubar 作为根窗口的子窗口,而不是顶层窗口。菜单栏必须是其所在窗口的子级。

  • 除了使菜单成为按钮的子项之外,您还必须将菜单链接到菜单按钮(例如:self.menubar.configure(menu=mb_radmenu)

  • 添加级联时需要给标签(如:mbmenu.add_cascade(label="Rad", menu=mb_radmenu)

  • 如果你想创建一个按钮而不是传统的菜单栏,你不需要配置窗口的menu选项

这里有一个版本的代码可以解决所有这些问题:

from tkinter import *

class TestMenu:
        def __init__(self, master):
            self.master = master

            self.top = Toplevel(width=200, relief=RAISED, borderwidth=2)
            self.menubar = Menubutton(self.top, text='Menubutton', relief=RAISED,
                                      activebackground='#3399ff', bg='white', fg='black')
            self.menubar.pack(side="top")

            mb_radmenu = Menu(self.menubar)
            self.menubar.configure(menu=mb_radmenu)

            mb_radmenu.add_radiobutton(label='A')
            mb_radmenu.add_radiobutton(label='B')
            mb_radmenu.add_radiobutton(label='C')

def main():
    root = Tk()
    root.withdraw()
    app = TestMenu(root)
    root.mainloop()

if __name__ == '__main__':
    main()

我没有在示例中更改它,但我强烈建议您不要将菜单命名为 button self.menubar。当你把它们混在一起时,你的代码很难理解。

【讨论】:

  • 这更有意义。非常感谢这些提示。还有一个问题。 .pack() 究竟是做什么的?真的。我将重命名 self.menubar,因为它也混淆了我。
  • pack 是三个几何管理器之一。另外两个是gridplace。它使小部件被添加到窗口中。
  • 啊,明白了。再次感谢!
猜你喜欢
  • 2022-12-31
  • 2014-03-16
  • 2019-07-04
  • 2021-12-16
  • 1970-01-01
  • 2013-07-06
  • 2018-07-27
  • 2013-03-20
  • 1970-01-01
相关资源
最近更新 更多