2010-12-06 11 views
3

Pour quelque raison que ce soit, ce bouton appelle automatiquement bot_analysis_frame sans appuyer sur le bouton. Je suppose que c'est parce que le command est une fonction avec des arguments.La commande de bouton est appelée automatiquement

Existe-t-il un moyen pour que le bouton n'appelle que cette fonction et passe les variables requises seulement après avoir été pressé?

Button(topAnalysisFrame, text='OK', command=bot_analysis_frame(eventConditionL, eventBreakL)).pack(side=LEFT) 
+0

double possible de [Pourquoi? « Commande » est paramètre Button exécuté lorsque déclaré] (http://stackoverflow.com/questions/5767228/why-is-button-parameter-command-command-execute-when-declarated) – nbro

Répondre

13

Lisez la section ici en passant callbacks.

Vous stockez le résultat de cette fonction dans l'argument de commande et non dans la fonction elle-même.

Je crois que ce:

command = lambda: bot_analysis_frame(eventConditionL,eventBreakL) 

peut travailler pour vous.

+2

Notez que les fermetures créées dans une boucle ne fonctionneront pas comme "attendues" (cela fonctionne réellement correctement, vous devez juste obtenir que les fermetures capturent vraiment les variables , pas de valeurs). Toutes les fonctions créées dans '[lambda: print (i) for i dans range (5)]' afficheront la valeur finale de 'i', 4. Vous pouvez contourner ce paramètre par des arguments par défaut, qui sont liés au moment de la définition: 'lambda i = i: print (i)' fonctionnera. – delnan

1

Je suis assez sûr que cela a déjà été répondu. Au lieu de cela:

Button(topAnalysisFrame, 
     text='OK', 
     command=bot_analysis_frame(eventConditionL,eventBreakL)).pack(side=LEFT) 

Vous pouvez utiliser lambda comme ceci:

Button(topAnalysisFrame, 
     text="OK", 
     command=lambda: bot_analysis_frame(eventConditionL, eventBreakL)).pack(side=LEFT)