python tkinter:拉下时自定义菜单

时间:2013-04-25 13:20:35

标签: python menu tkinter

我正在学习使用Python和Tkinter创建软件。现在我需要根据不同的条件更改菜单项,但找不到简单的方法。好吧,让我试着用一个例子清楚地解释我的问题:

enter image description here

如图所示,我左边有一个列表框,右边有一个列表框。我还有一个菜单来移动项目,命令是“向右移动”,“向左移动”和“交换”。考虑以下条件:

  1. 当我只在左侧列表框中选择了项目时,我只想启用“向右移动”命令,如图所示。
  2. 当我只在右侧列表框中选择了项目时,我只想启用“向左移动”命令。
  3. 当我在两个列表框中选择了项目时,我希望启用所有命令。
  4. 当我没有选择任何项目时,我希望禁用所有命令。
  5. 我知道我可以通过将事件“ListboxSelect”和“Button-1”绑定到某些函数来完成工作,然后使用这些函数来配置菜单。但是当我在实际软件中有五个列表框时,这真的是一项复杂的工作。所以我想知道是否有一种简单的方法可以做到这一点,比如在tkinter.Menu类中重载一些函数(我试过重载post(),grid(),pack()和place(),它们都不起作用)。

    欢迎任何想法。

1 个答案:

答案 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

如果您开始添加更多项目,您可能想要做的就是为每个菜单项创建一个类。在该类中,您可以放入启用/禁用和回调函数实现的逻辑。评论你是否想看一个例子。