我想做以下(只是一个例子,真正的代码有更多菜单和更多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"})
提前感谢任何建议!
答案 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')