2010-11-13 13 views
0

Je crée un programme GUI dans Tkinter et je rencontre des problèmes. Ce que je veux faire, c'est dessiner 2 cases à cocher et un bouton. Selon l'entrée de l'utilisateur, les prochaines étapes doivent avoir lieu. Une partie de mon code a été indiqué ci-dessous: -Gestion des événements combinés de widgets dans TKinter

CheckVar1 = IntVar() 
CheckVar2 = IntVar() 
self.C1 = Checkbutton(root, text = "C Classifier", variable = CheckVar1, onvalue = 1, offvalue = 0, height=5,width = 20).grid(row=4) 

self.C2 = Checkbutton(root, text = "GClassifier", variable = CheckVar2, onvalue = 1, offvalue = 0, height=5, width = 20).grid(row=5) 

self.proceed1 = Button(root,text = "\n Proceed",command =  self.proceed(CheckVar1.get(),CheckVar2.get())).grid(row=6) 

# where proceed prints the combined values of 2 checkboxes 

L'erreur que je reçois est typique soit une valeur par défaut des deux cases sélectionnées est imprimé et puis il n'y a pas d'autres commentaires. L'erreur que je reçois est NullType Object n'est pas appelable. J'ai cherché sur le net et je pense que la réponse est liée à des événements lambda ou curry.

S'il vous plaît aider ..

+0

Veuillez noter que 'Checkbutton (...)' évalue à un Checkbutton, alors que 'Checkbutton (...) .grid (...)' évalue à None, pourquoi stockez-vous None à self.C1, self.C2 et self.proceed1? – tzot

Répondre

1

vous passez la valeur de self.proceed(CheckVar1.get(),CheckVar2.get()) au constructeur Button, mais sans doute ce que vous voulez est pour command à définir une fonction qui appellera self.proceed(CheckVar1.get(),CheckVar2.get()) et retourner un nouvelle valeur, éventuellement différente, chaque fois que le bouton est enfoncé. Vous pouvez corriger cela avec un lambda, ou en enveloppant l'appel dans une courte fonction de rappel. Par exemple, remplacez la dernière ligne par:

def callback(): 
    return self.proceed(CheckVar1.get(), CheckVar2.get()) 
self.proceed1 = Button(root, text="\n Proceed", command=callback).grid(row=6) 

Ceci est assez typique de Tkinter. Rappelez-vous: lorsque vous voyez une variable appelée command dans Tkinter, elle recherche une fonction, pas une valeur.

EDIT: pour être clair: vous obtenez 'NullType Object n'est pas appelable' parce que vous avez défini command pour égaler la valeur de retour d'un seul appel à self.proceed (c'est l'objet NullType). self.proceed est une fonction, mais sa valeur de retour ne l'est pas. Ce dont vous avez besoin est de définir command comme une fonction qui appelle self.proceed.

+0

Hey, vraiment désolé c'est mon erreur car il n'était pas clair du code self.proceed est une fonction qui les prend en entrée et imprime les valeurs ... –

+1

ne change pas ma réponse Votre code appelle actuellement 'self.proceed' onc e, et définit 'command' comme égal à * value * de' self.proceed', lorsque vous voulez définir 'command' sur une fonction * qui appelle' self.proceed 'chaque fois que vous appuyez sur le bouton. –

+0

Hey Merci mon erreur a disparu, mais je ne parviens pas à obtenir le résultat que je veux. En cela, je veux opérer sur les valeurs de CheckVar1 et CheckVar2. Comment puis-je le faire. Je pense que ma compréhension était erronée. –

0

Comme Peter Milley dit, l'option command a besoin d'une référence à une fonction (par exemple: donner une fonction nom (ie:. Pas entre parenthèses) Ne pas essayer quelque chose "en ligne", créer une fonction spéciale. Votre code sera plus facile à comprendre et à maintenir