Python Tkinter Menubutton with radiobutton 下拉菜单



我一直在深入研究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()

你的代码有很多问题。

  • 不能将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()

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

最新更新