0

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

在此处输入图像描述

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

  1. 当我只在左侧列表框中选择项目时,我只希望启用“向右移动”命令,如图所示。
  2. 当我只在右侧列表框中选择项目时,我只希望启用“向左移动”命令。
  3. 当我在两个列表框中选择项目时,我希望启用所有命令。
  4. 当我没有选择任何项目时,我希望禁用所有命令。

我知道我可以通过将事件“ListboxSelect”和“Button-1”绑定到某些函数来完成工作,然后使用这些函数来配置菜单。但是当我在实际软件中有五个列表框时,这确实是一项复杂的工作。所以我想知道是否有一种简单的方法可以做到这一点,比如重载 tkinter.Menu 类中的一些函数(我尝试重载 post()、grid()、pack() 和 place(),它们都不起作用)。

欢迎任何想法。

4

1 回答 1

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

如果您开始添加更多项目,您可能想要为每个菜单项创建一个类。在该类中,您可以输入启用/禁用逻辑和回调函数实现。如果您想查看示例,请发表评论。

于 2013-04-25T14:51:43.243 回答