【问题标题】:Reducing menu.add_command() clutter/repeat lines减少 menu.add_command() 杂乱/重复行
【发布时间】:2011-08-11 02:19:02
【问题描述】:

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

提前感谢您的任何建议!

【问题讨论】:

    标签: python syntax widget tkinter


    【解决方案1】:

    这是你想要做的翻译:

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

    我解决了三个问题。

    首先是字典键如果是字符串则需要引用。如果您想要一个将字符串'label' 映射到字符串'cut' 的dict,您可以使用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')
    

    【讨论】:

    • +1 替代建议。 “labeldic”解决方案丑陋且难以阅读——完全否定了“消除混乱”所获得的任何东西。除了对性能最敏感的情况外,应始终努力使代码尽可能可读。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-09-20
    • 1970-01-01
    • 1970-01-01
    • 2019-04-21
    • 2022-01-17
    • 1970-01-01
    • 2016-12-20
    相关资源
    最近更新 更多