2016-10-08 1 views
0

J'utilise Tkinter dans une application GUI de base de Python 2.7 et je souhaite récupérer le statut du widget Checkbutton en utilisant un IntVar mais j'obtiens l'erreur suivante.Récupérer Tkinter Checkbutton Statut: TclError: impossible de lire "PY_VAR": aucune variable de ce type

TclError: can't read "PY_VAR": no such variable 

J'ai suivi l'exemple sur effbot about the Checkbutton Widget et je me sers d'un IntVar différent pour chaque bouton et en utilisant une fonction callback d'imprimer la variable en appelant la fonction getvar sur les boutons.

Mon seul objectif est d'afficher un état du widget Checkbutton. J'utilise le gestionnaire de géométrie de grille Tkinter pour placer les widgets sur l'interface graphique. Voici un exemple MCVE qui produit l'erreur.

#!/usr/bin/env python 

import Tkinter as tk 

class Frame(tk.Frame): 
    def __init__(self, master): 
     tk.Frame.__init__(self, master) 
     self.buttons = dict() #number to button widget 
     self.createWidgets(master) 

    def printvar(self, button_number): 
     print self.buttons[button_number].getvar() 

    def createWidgets(self,master): 
     for n in range(0,4): 
      var = tk.IntVar() 
      button = tk.Checkbutton(
       master, 
       variable=var, 
       command=lambda bn=n: self.printvar(bn) 
      ) 
      button.grid(row=0, column=n) 
      self.buttons[n] = button 

window = Frame(tk.Tk()) 
window.mainloop() 

Le code fait quatre touches numériques qui passent le nombre à une fonction lambda qui recherche le bouton dans un dict et appelle sa fonction getvar correspondante.

Si vous exécutez l'exemple de code, l'erreur suivante se produit lorsque vous vérifiez l'un des quatre boutons. Il est dans un fichier nommé tktest.py

Exception in Tkinter callback 
Traceback (most recent call last): 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 1540, in __call__ 
    return self.func(*args) 
    File "./tktest.py", line 20, in <lambda> 
    command=lambda bn=n: self.printvar(bn) 
    File "./tktest.py", line 12, in printvar 
    print self.buttons[button_number].getvar() 
    File "/usr/lib/python2.7/lib-tk/Tkinter.py", line 513, in getvar 
    return self.tk.getvar(name) 
TclError: can't read "PY_VAR": no such variable 

Il n'y a pas de variable var pour chaque bouton et je demande donc la méthode getvar. Toute autre méthode permettant de vérifier chaque état du widget Checkbutton serait également acceptable.

Répondre

2

EDIT: Créez d'abord n ​​nombre de var pour l'utilisation et que pour chaque bouton et sauvegardez dans une liste.

def createWidgets(self,master): 
    self.vars=[] 
    for n in range(0,4): 
     var = tk.IntVar() 
     self.vars.append(var) 

    for n in range(0,4): 
     button = tk.Checkbutton(
      master, 
      variable=self.vars[n], 
      command=lambda bn=n: self.printvar(bn) 
     ) 
     button.grid(row=0, column=n) 
     self.buttons[n] = button 

et vous pouvez changer votre méthode pour cela pour appeler le var pour le nombre

def printvar(self, button_number): 
    print "The button:{} is {}".format(button_number,self.vars[button_number].get()) 

La sortie par exemple est:

The button:2 is 0 
The button:2 is 1 

lorsque 0 est décoché et 1 vérifié

+1

Vous avez raison, je modifier la réponse – riojano0

+0

va essayer, vous le ferons savoir –