2010-06-01 4 views
1

Je crée un petit script en python avec ttk et j'ai un problème où une fonction s'exécute où elle ne devrait pas. Le code du bouton se présente comme suit:Python ttk.Button -commande, s'exécute sans bouton pressé

 
btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=loadModelTree(treeModel)) 
btReload.pack(side="left") 

et la fonction est la suivante:

 
def loadModelTree(tree): 
    print ("Loading models...") 
    allModels = os.listdir(confModPath) 
    for chunk in allModels: 
     ... 

Pour une raison quelconque, la fonction fonctionne sans le bouton enfoncé. Pourquoi?

Répondre

1

Eh bien, comme j'ai trouvé la réponse, je vais répondre à ma propre question. Il appers que les commandes ne ttk.button pas envoyer d'arguments aux fonctions de sorte que le travail est autour de faire comme suit:

 
btReload = ttk.Button(treeBottomUI, text="Reload", width=17, command=lambda i=treeModel: loadModelTree(i)) 
btReload.pack(side="left") 

simple comme bonjour!

2

Markus, oui, c'est la bonne solution, mais ce n'est pas parce que vous ne pouvez pas utiliser des commandes multi-arguments dans les légendes de widgets. Considérez, dans votre code d'origine, ...command=loadModelTree(treeModel)... est un invocation de la méthode. Lambda vous permet de faire abstraction de la commande afin que vous puissiez avoir un nombre arbitraire d'arguments sans confondre l'interpréteur en l'invoquant, par exemple, ...command=lambda arg1=myarg1, arg2=myarg2, arg3=myarg3: myCallout(arg1, arg2, arg3)....

J'espère que cela rendra ce qui se passe un peu plus clair.

Questions connexes