2011-04-22 52 views
2

我願做以下的(只是一個例子,真正的代碼有更多的菜單和更多add_command的):減少menu.add_command()雜波/重複線

editmenu.add_command(label="Cut",state="disabled") 
editmenu.add_command(label="Copy",state="disabled") 
editmenu.add_command(label="Paste",state="disabled") 
editmenu.add_command(label="Delete",state="disabled") 

但在較少的線路,其實,如果可能的話,只需一行。我的菜單佔用了大量的空間,並希望減少混亂。另外,我的程序員看到了一堆類似的線條,並且覺得必須有一種方法來減少它們。

我試過下面的代碼無濟於事;我明顯得到一個名稱錯誤,因爲標籤和狀態沒有定義...

for labeldic in [{label:"Cut"},{label:"Copy"},{label:"Paste"},{label:"Delete"}]: editmenu.add_command(labeldic+{state:"disabled"}) 

在此先感謝您的任何建議!

回答

4

這裏有你想要做什麼翻譯:

for labeldic in [{"label":"Cut"},{"label":"Copy"},{"label":"Paste"},{"label":"Delete"}]: 
    labeldic.update({"state": "disabled"}) 
    editmenu.add_command(**labeldic) 

有我固定的三個問題。

首先是字典鍵需要被引用,如果他們是字符串。 dict(label='cut'):如果你想有一個字典字符串'label'映射到字符串'cut',您可以使用dict文字{'label': 'cut'},否則可能與dict()構造函數擴展關鍵字參數這種方式做到這一點。正如你發現的那樣,{label: 'cut'}不會工作,因爲它試圖爲鍵使用變量的值,但是沒有這樣的變量。

第二個是你不能使用+運算符合並字典。不幸的是,這行不通。但是,有一個update method可以調用它所調用的字典。由於它不會返回合併的字典,因此不能像您使用的方式內聯使用+。

第三個問題是傳遞字典與傳遞關鍵字參數不同。 foo(bar='baz')foo({'bar':'baz'})不一樣,但其foo(**{'bar':'baz'})相同。函數中的**語法將"unpacks"字典轉換爲關鍵字參數。

無論它有點怪異的風格。這是我會做什麼,而不是:

for label in ['Cut', 'Copy', 'Paste', 'Delete']: 
    editmenu.add_command(label=label, state='disabled') 
+0

非常好,非常感謝很詳盡的解釋:) – Symon 2011-04-22 17:50:37

+0

+1的替代建議。 「有標籤的」解決方案很難看,也很難讀懂 - 完全否定了通過「消除混亂」獲得的任何東西。除了對性能敏感最多的情況外,應儘量使代碼儘可能易讀。 – 2011-04-23 13:45:38