减少menu.add_command()杂乱/重复行

时间:2011-04-22 16:49:57

标签: python syntax widget tkinter

我想做以下(只是一个例子,真正的代码有更多菜单和更多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"})

提前感谢任何建议!

1 个答案:

答案 0 :(得分:4)

以下是您想要做的翻译:

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

我修复了三个问题。

首先,如果字典键是字符串,则需要引用它们。如果你想要一个dict将字符串'label'映射到字符串'cut',你可以使用dict文字{'label': 'cut'},或者可能使用扩展的dict()构造函数这样的关键字参数:dict(label='cut')。正如您所发现的,{label: 'cut'}不起作用,因为它试图使用变量的值作为键,但没有这样的变量。

第二个是你不能使用+运算符合并字典。不幸的是,它不起作用。但是,有一个update method会改变它所要求的字典。由于它不返回合并的dict,因此不能像使用+。

那样内联使用

第三个问题是传递dict与传递关键字参数不同。 foo(bar='baz')foo({'bar':'baz'})不同,但 foo(**{'bar':'baz'})相同。函数中的**语法将"unpacks"字典调用为关键字参数。

无论是那种怪异的风格。这就是我要做的事情:

for label in ['Cut', 'Copy', 'Paste', 'Delete']:
    editmenu.add_command(label=label, state='disabled')
相关问题