簡體   English   中英

python tkinter:下拉時的自定義菜單

[英]python tkinter: Custom menu while pulling down

我正在學習使用Python和Tkinter創建軟件。 現在,我需要更改菜單項以適應不同的條件,但是找不到簡便的方法。 好吧,讓我嘗試使用一個示例清楚地解釋我的問題:

在此處輸入圖片說明

如圖所示,我在左側有一個列表框,在右側有一個列表框。 我也有一個菜單來移動項目,命令是“向右移動”,“向左移動”和“交換”。 考慮以下條件:

  1. 當我只在左側列表框中選擇項目時,我只希望啟用“向右移動”命令,如圖所示。
  2. 當我只在右側列表框中選擇項目時,我只希望啟用“向左移動”命令。
  3. 當我在兩個列表框中都選擇了項目時,我希望啟用所有命令。
  4. 當我未選擇任何項目時,我希望禁用所有命令。

我知道我可以通過將事件“ ListboxSelect”和“ Button-1”綁定到某些功能來完成工作,然后使用這些功能來配置菜單。 但是,當實際軟件中有五個列表框時,這確實是一項復雜的工作。 因此,我想知道是否有一種簡單的方法來執行此操作,例如重載tkinter.Menu類中的某些函數(我嘗試重載post(),grid(),pack()和place(),但它們都不起作用)。

任何想法都歡迎。

我認為您要使用的是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

如果您開始添加更多項目,則可能要為每個菜單項創建一個類。 在該類中,您可以放入啟用/禁用和回調函數實現的邏輯。 如果您想查看示例,請發表評論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM