Сокращение menu.add_command () загромождает / повторяет строки - PullRequest
2 голосов
/ 22 апреля 2011

Я хотел бы сделать следующее (просто пример, в реальном коде больше меню и больше add_command's):

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 Ответ

4 голосов
/ 22 апреля 2011

Вот перевод того, что вы хотели сделать:

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(), который расширяет аргументы ключевых слов таким образом:,Как вы обнаружили, {label: 'cut'} не будет работать, потому что он пытается использовать значение переменной для ключа, но такой переменной нет.

Во-вторых, вы не можете объединить словари с помощью +оператор.Это не работает, к сожалению.Тем не менее, существует метод обновления , который изменяет код, по которому он вызывается.Так как он не возвращает объединенный dict, он не может использоваться внутри строки так же, как вы использовали +.

Третья проблема заключается в том, что передача dict отличается от передачи аргументов ключевого слова.foo(bar='baz') - это не то же самое, что foo({'bar':'baz'}), но - это и foo(**{'bar':'baz'}).Синтаксис ** в вызове функции "распаковывает" словарь в аргументы ключевых слов.

Независимо от того, что это странный стиль.Вот что я бы сделал вместо этого:

for label in ['Cut', 'Copy', 'Paste', 'Delete']:
    editmenu.add_command(label=label, state='disabled')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...