2008-12-09 18 views
1

J'essayais d'écrire du code qui fermait automatiquement une fenêtre Toplevel Tk en Python. J'ai fini par le faire fonctionner, mais j'ai eu un petit problème en cours de route que je n'ai pas réussi à comprendre.détruire une fenêtre Toplevel tk en python

Les deux deuxièmes boutons fonctionnent, mais le premier ne contrôle pas et je ne comprends pas pourquoi ...

Toutes les idées?

from Tkinter import * 

root = Tk() 
def doDestroy(): 
    TL.destroy() 

TL = Toplevel() 
TL.b = Button (TL, text="lambda destroy", command=lambda: TL.destroy) 
TL.b.pack() 

TL.b2 = Button (TL, text="callback destroy", command=doDestroy) 
TL.b2.pack() 

de = lambda: TL.destroy() 
TL.b3 = Button (TL, text="lambda that works", command=de) 
TL.b3.pack() 
root.mainloop() 

Répondre

8

Parce qu'il renvoie une fonction et non son résultat.

Vous devez mettre:

command=TL.destroy 

ou si vous avez utilisé lambda:

command=lambda: TL.destroy() 
+0

Je comprends que lambda retourne une fonction, mais pas la même chose que le passage TL.destroy? Les deux sont des références à des fonctions, non? – Hortitude

+1

non, lambda fonctionne exactement comme def mais c'est anonyme, vous devez mettre la même chose dans le corps. Donc dans votre essai avec lambda, une fonction n'est pas assignée à commande, mais une fonction renvoyant une fonction (une indirection trop). Tandis que TL.destroy est une fonction, alors c'est OK. –

+0

J'ai compris. Merci! – Hortitude

Questions connexes