2 votes

Réduction des lignes d'encombrement/de répétition de menu.add_command()

Je voudrais faire ce qui suit (juste un exemple, le vrai code a plus de menus et plus d'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")

Mais sur moins de lignes, en fait, une seule ligne si possible. J'ai des menus qui prennent beaucoup de place dans mon programme et j'aimerais réduire ce désordre. De plus, le programmeur en moi voit un tas de lignes similaires et pense qu'il doit y avoir un moyen de les réduire.

J'ai essayé le code suivant sans succès ; j'ai évidemment obtenu un nameerror parce que label et state ne sont pas définis...

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

Merci d'avance pour toute suggestion !

4voto

Devin Jeanpierre Points 23162

Voici une traduction de ce que vous vouliez faire :

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

Il y avait trois problèmes que j'ai résolus.

La première est que les clés des dictionnaires doivent être citées si elles sont des chaînes de caractères. Si vous voulez un dict mettant en correspondance la chaîne de caractères 'label' à la chaîne de caractères 'cut' vous pouvez le faire en utilisant le littéral dict. {'label': 'cut'} ou encore éventuellement avec le dict() qui développe les arguments des mots-clés de cette façon : dict(label='cut') . Comme vous l'avez découvert, {label: 'cut'} ne fonctionnerait pas, car elle tente d'utiliser la valeur d'une variable pour la clé, mais cette variable n'existe pas.

La seconde est que vous ne pouvez pas fusionner les dictionnaires en utilisant l'opérateur +. Cela ne fonctionne pas, malheureusement. Il existe cependant un méthode de mise à jour qui fait muter le dict sur lequel il est appelé. Puisqu'il ne retourne pas un dict fusionné, il ne peut pas être utilisé en ligne comme vous avez utilisé +.

Le troisième problème est que passer un dict n'est pas la même chose que passer des arguments de mots-clés. foo(bar='baz') n'est pas la même chose que foo({'bar':'baz'}) mais il es la même chose que foo(**{'bar':'baz'}) . Le site ** syntaxe dans l'appel de fonction "déballer" un dictionnaire en arguments de mots-clés.

Quoi qu'il en soit, c'est un style un peu bizarre. Voici ce que je ferais à la place :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X