Can';Mac上Python tkinter中的可重入菜单

Can';Mac上Python tkinter中的可重入菜单,python,macos,python-2.7,menu,tkinter,Python,Macos,Python 2.7,Menu,Tkinter,我在Tkinter中创建了一个GUI,它有一个菜单。我想要一个按钮,当点击时可以切换菜单的启用/禁用 因此,我编写了下面的最小示例(基于),它在我的Windows7和Ubuntu 14.04机器上运行良好(使用Python 2.7.6和Tkinter修订版81008)。然而,当我在Mac10.9上尝试相同的代码(同样在Python2.7.6和Tkinter修订版81008下)时,菜单将禁用,但无法重新启动。此外,下面的示例还打印出它认为菜单具有的状态(使用entrycget),并打印出它认为菜单

我在Tkinter中创建了一个GUI,它有一个菜单。我想要一个按钮,当点击时可以切换菜单的启用/禁用

因此,我编写了下面的最小示例(基于),它在我的Windows7和Ubuntu 14.04机器上运行良好(使用Python 2.7.6和Tkinter修订版81008)。然而,当我在Mac10.9上尝试相同的代码(同样在Python2.7.6和Tkinter修订版81008下)时,菜单将禁用,但无法重新启动。此外,下面的示例还打印出它认为菜单具有的状态(使用entrycget),并打印出它认为菜单在启用和禁用之间交替

有人能复制这种行为吗?这是已知的bug吗?或者有没有其他方法可以启用/禁用Mac上的菜单

from Tkinter import *

root=Tk()

def hello():
    print "hello !"

menubar = Menu(root)
submenu = Menu(menubar, tearoff=0)
submenu.add_command(label="Hello", command=hello)
menubar.add_cascade(label='test', menu=submenu)
root.config(menu=menubar)

def toggle():
    print('I think the menu bar is %s' % menubar.entrycget(0,"state"))
    if menubar.entrycget('test', "state")=="normal":
        print('disabling')
        menubar.entryconfig('test', state=DISABLED)
        print('disbled')
    else:
        print('enabling')
        menubar.entryconfig('test', state=NORMAL)
        print('done')


b = Button(root, text='Toggle', command=toggle)
b.pack()

root.mainloop()
如中所述,这似乎是苹果提供的Tk 8.5中的一个bug。自OSX10.6以来,苹果一直在发布Tk的可可版本,这些版本存在许多问题,其中许多问题已在TK8.5的较新版本中得到修复。使用当前的ActiveTcl 8.5.15,您的测试似乎工作正常。不幸的是,您无法轻松更改苹果提供的系统python使用的Tcl/Tk版本。一个选项是从Python.org二进制安装程序和ActiveTcl 8.5.15安装当前的Python 2.7.7。这里有更多信息:

如中所述,这似乎是苹果提供的Tk 8.5中的一个缺陷。自OSX10.6以来,苹果一直在发布Tk的可可版本,这些版本存在许多问题,其中许多问题已在TK8.5的较新版本中得到修复。使用当前的ActiveTcl 8.5.15,您的测试似乎工作正常。不幸的是,您无法轻松更改苹果提供的系统python使用的Tcl/Tk版本。一个选项是从Python.org二进制安装程序和ActiveTcl 8.5.15安装当前的Python 2.7.7。这里有更多信息:


我可以复制它,FWIW。它看起来像OSX上Tkinter中的一个bug。这里也是。看来你的代码应该能用。谢谢你让我知道。我可以问一下您使用的是什么版本的OSX、Python和Tkinter吗?我可以复制它,FWIW。它看起来像OSX上Tkinter中的一个bug。这里也是。看来你的代码应该能用。谢谢你让我知道。我可以问一下您使用的是什么版本的OSX、Python和Tkinter吗?