我正在学习使用Python和Tkinter创建软件。现在我需要根据不同的条件更改菜单项,但找不到简单的方法。好吧,让我试着用一个例子清楚地解释我的问题:
如图所示,我左边有一个列表框,右边有一个列表框。我还有一个菜单来移动项目,命令是“向右移动”,“向左移动”和“交换”。考虑以下条件:
我知道我可以通过将事件“ListboxSelect”和“Button-1”绑定到某些函数来完成工作,然后使用这些函数来配置菜单。但是当我在实际软件中有五个列表框时,这真的是一项复杂的工作。所以我想知道是否有一种简单的方法可以做到这一点,比如在tkinter.Menu类中重载一些函数(我试过重载post(),grid(),pack()和place(),它们都不起作用)。
欢迎任何想法。
答案 0 :(得分:1)
我认为你想要使用的是postcommand
来适当修改菜单。如果您将拥有多个列表框,最简单的解决方案可能是实现您自己的类。这是一个粗略的想法:
class EditMenu(Tkinter.Menu):
def __init__(self, parent, listboxes, **kw):
self.commandhook = kw.get('postcommand', None)
kw['postcommand'] = self.postcommand
super(EditMenu, self).__init__(parent, **kw)
self.listboxes = listboxes
self.add_command(label="Move to right", command=self.move_to_right)
self.add_command(label="Move to left", command=self.move_to_left)
self.add_command(label="Exchange", command=self.exchange)
def postcommand(self):
for i in xrange(3):
# do some checks for each entry
# and set state to either Tkinter.DISABLED or Tkinter.NORMAL
self.entryconfig(i, state=state)
if self.commandhook is not None:
self.commandhook()
# Implement your three functions here
如果您开始添加更多项目,您可能想要做的就是为每个菜单项创建一个类。在该类中,您可以放入启用/禁用和回调函数实现的逻辑。评论你是否想看一个例子。