Python Tkinter Menubutton与radiobutton下拉列表

时间:2018-04-06 20:11:35

标签: python-3.x tkinter

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

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

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()

1 个答案:

答案 0 :(得分:0)

您的代码有很多问题。

  • 您无法使用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.menu bar 。当你把它们混合起来时,你的代码很难理解。