2016-04-25 2 views
0

Die Steuervariable funktioniert nicht, wenn ein Verweis auf ein Objekt in einer Liste als Variableneigenschaft eines Widgets verwendet wird. Der folgende Code veranschaulicht ein Beispiel für ein Anwendungsobjekt, das auf eine Liste von TkInt-Objekten festgelegt wird. Ein Testbeispiel wird nur auf eine Membervariable gesetzt, bei der ein einzelnes TkInt-Objekt wie erwartet funktioniert. Warum schlägt das fehl und was ist die richtige Art, Widgets und Steuervariablen zu verwalten, die in der Anzahl variabel sind?Warum können PyTk Tkinter-Steuerwertvariablen nicht aktualisiert werden, wenn sie in einer Liste gespeichert sind? Was ist die Alternative?

import tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.pack() 
     self.createWidgets() 
     self.line_whole = [tk.IntVar() for _ in range(6)] 

    def createWidgets(self): 
     tk 
     self.line_whole=list() 
     #self.line_whole = [tk.IntVar() for _ in range(6)] 
     self.line_whole_cb = list() 
     for x in range(6): 
      self.line_whole.append(tk.IntVar()) 
      self.line_whole_cb.append(tk.Checkbutton(self,variable=self.line_whole[x])) 
      self.line_whole_cb[x].pack(side="left") 
     self.test_val = tk.IntVar() 
     self.test_cb = tk.Checkbutton(self,variable=self.test_val) 
     self.test_cb.pack(side="bottom") 
     self.output_record_btn = tk.Button(self) 
     self.output_record_btn["text"] = "Output Check Values" 
     self.output_record_btn["command"] = self.say_hi 
     self.output_record_btn.pack(side="top") 

     self.QUIT = tk.Button(self, text="QUIT", fg="red", 
              command=root.destroy) 
     self.QUIT.pack(side="bottom") 

    def say_hi(self): 
     print("checks:",",".join([str(tk_int.get()) for tk_int in self.line_whole])) 
     print ("test_check",self.test_val.get()) 

root = tk.Tk() 
app = Application(master=root) 
app.mainloop() 
+0

ich diese Referenz aus der Standard-Python-Dokumentation für viersion 3.5 verknüpft wurde mit der tk.IntVar sagte verwenden http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/control-variables .html –

Antwort

1

Hier ist eine korrigierte Version mit minimalen Änderungen:

Sie createWidgets Aufruf wurden vor self.line_whole gesetzt wurde. Ich nehme an, deshalb haben Sie es neu erstellt. Sie mussten einfach die Reihenfolge ändern, in der Sie die Dinge anriefen. Kleinere Sache, wenn Sie nicht planen, die onvalue und offvalue Attribute zu ändern, warum nicht eine BooleanVar() verwenden? Da die einzigen Werte, die dies annehmen kann, sind 0 und 1, und dies sind die Standardwerte der Ein- und Aus-Werte der Prüfschaltflächen. Entweder funktioniert das natürlich und die Wahl ist nur Semantik.

import tkinter as tk 

class Application(tk.Frame): 
    def __init__(self, master=None): 
     tk.Frame.__init__(self, master) 
     self.pack() 
     self.line_whole = [tk.IntVar() for _ in range(6)] 
     self.createWidgets() 

    def createWidgets(self): 
     #self.line_whole = [tk.IntVar() for _ in range(6)] 
     self.line_whole_cb = list() 
     for x in range(6): 
      self.line_whole_cb.append(tk.Checkbutton(self, 
       variable=self.line_whole[x])) 
      self.line_whole_cb[x].pack(side="left") 
     self.test_val = tk.IntVar() 
     self.test_cb = tk.Checkbutton(self,variable=self.test_val) 
     self.test_cb.pack(side="bottom") 
     self.output_record_btn = tk.Button(self) 
     self.output_record_btn["text"] = "Output Check Values" 
     self.output_record_btn["command"] = self.say_hi 
     self.output_record_btn.pack(side="top") 

     self.QUIT = tk.Button(self, text="QUIT", fg="red", 
              command=root.destroy) 
     self.QUIT.pack(side="bottom") 

    def say_hi(self): 
     print("checks:",",".join([str(tk_int.get()) for tk_int in self.line_whole])) 
     print ("test_check",self.test_val.get()) 

root = tk.Tk() 
app = Application(master=root) 
root.mainloop() 
Verwandte Themen