2011-04-22 60 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