Python 3.4 tkinter checkbutton variable handhabung funktioniert nicht und antwortet

EDIT Dies ist nun auf Python 3.4.3 tkinter – Programm friert auf Deklaration von IntVar oder einem anderen tkinter Datentyp, wie das ist die Wurzel des Problems, das jetzt gelöst wurde. Grundsätzlich nennen Sie NIEMALS "Master" in Python 3.x mit tkinter, es verursacht eine Endlosschleife: (Mein vollständiger Code wurde jetzt entfernt, wie es meine Kursarbeit ist und würde nicht wollen, dass die Leute es nickten: D EDIT

Ich bin relativ neu bei tkinter und kann nicht sehen, wo ich falsch gehe. Ich habe versucht, einen StringVar () und einen regulären String zu verwenden, um mehrere Eingabefelder zu löschen, wenn ein Checkbutton aktiviert ist. Hier ist der Rahmen, dass das Problem ist in:

class CActivity(tk.Frame): def Clear(self): pass # To be completed def Today(self): if self.todayVar == "ON": self.day.configure(state="disabled") self.month.configure(state="disabled") self.year.configure(state="disabled") else: self.day.configure(state="normal") self.month.configure(state="normal") self.year.configure(state="normal") def createWidgets(self): self.title = tk.Label(self) self.title["text"] = "Add an Activity" self.title["font"] = ("Times New Roman",30) self.title["fg"] = "purple" self.title.grid(row=0,column=0,sticky="W",padx=5,pady=5) self.todayVar = "" tk.Label(self,text="Activity Name:",font=("Times New Roman",15)).grid(row=1,column=0,sticky="W",padx=5,pady=5) name = tk.Entry(self).grid(row=1,column=1,columnspan=3,sticky="E",padx=5,pady=5) tk.Label(self,text="Priority:",font=("Times New Roman",15)).grid(row=2,column=0,sticky="W",padx=5,pady=5) priority = tk.Checkbutton(self).grid(row=2,column=1,sticky="W",padx=0,pady=5) tk.Label(self,text="Today?",font=("Times New Roman",15)).grid(row=3,column=0,sticky="W",padx=5,pady=5) today = tk.Checkbutton(self,onvalue="ON",offvalue="OFF",variable=self.todayVar,command=self.Today).grid(row=3,column=1,sticky="W",padx=0,pady=5) #problem possibly on this line tk.Label(self,text="Date (DD/MM/YYYY):",font=("Times New Roman",15)).grid(row=4,column=0,sticky="W",padx=5,pady=5) day = tk.Entry(self,width=2).grid(row=4,column=1,sticky="W",padx=2,pady=5) month = tk.Entry(self,width=2).grid(row=4,column=2,sticky="W",padx=2,pady=5) year = tk.Entry(self,width=4).grid(row=4,column=3,sticky="W",padx=2,pady=5) self.clear = tk.Button(self, command=self.Clear) self.clear["text"] = "Clear" self.clear["font"] = ("Times New Roman",15) self.clear["fg"] = "red" self.clear.grid(row=7,column=4,sticky="WE",padx=5,pady=5) self.back = tk.Button(self) self.back["text"] = "Back" self.back["font"] = ("Times New Roman",15) self.back["fg"] = "red" self.back["command"] = self.parent.Menu self.back.grid(row=8,column=4,sticky="WE",padx=5,pady=5) def __init__(self, parent): tk.Frame.__init__(self, parent) self.pack() self.parent = parent self.createWidgets() 

Und hier ist es mit einem StringVar () statt einer Standard-Python-String:

 class CActivity(tk.Frame): def Clear(self): pass # To be completed def Today(self): if self.todayVar.get() == "ON": self.day.configure(state="disabled") self.month.configure(state="disabled") self.year.configure(state="disabled") else: self.day.configure(state="normal") self.month.configure(state="normal") self.year.configure(state="normal") def createWidgets(self): self.title = tk.Label(self) self.title["text"] = "Add an Activity" self.title["font"] = ("Times New Roman",30) self.title["fg"] = "purple" self.title.grid(row=0,column=0,sticky="W",padx=5,pady=5) self.todayVar = tk.StringVar() tk.Label(self,text="Activity Name:",font=("Times New Roman",15)).grid(row=1,column=0,sticky="W",padx=5,pady=5) name = tk.Entry(self).grid(row=1,column=1,columnspan=3,sticky="E",padx=5,pady=5) tk.Label(self,text="Priority:",font=("Times New Roman",15)).grid(row=2,column=0,sticky="W",padx=5,pady=5) priority = tk.Checkbutton(self).grid(row=2,column=1,sticky="W",padx=0,pady=5) tk.Label(self,text="Today?",font=("Times New Roman",15)).grid(row=3,column=0,sticky="W",padx=5,pady=5) today = tk.Checkbutton(self,onvalue="ON",offvalue="OFF",variable=self.todayVar,command=self.Today).grid(row=3,column=1,sticky="W",padx=0,pady=5) tk.Label(self,text="Date (DD/MM/YYYY):",font=("Times New Roman",15)).grid(row=4,column=0,sticky="W",padx=5,pady=5) day = tk.Entry(self,width=2).grid(row=4,column=1,sticky="W",padx=2,pady=5) month = tk.Entry(self,width=2).grid(row=4,column=2,sticky="W",padx=2,pady=5) year = tk.Entry(self,width=4).grid(row=4,column=3,sticky="W",padx=2,pady=5) self.clear = tk.Button(self, command=self.Clear) self.clear["text"] = "Clear" self.clear["font"] = ("Times New Roman",15) self.clear["fg"] = "red" self.clear.grid(row=7,column=4,sticky="WE",padx=5,pady=5) self.back = tk.Button(self) self.back["text"] = "Back" self.back["font"] = ("Times New Roman",15) self.back["fg"] = "red" self.back["command"] = self.parent.Menu self.back.grid(row=8,column=4,sticky="WE",padx=5,pady=5) def __init__(self, parent): tk.Frame.__init__(self, parent) self.pack() self.parent = parent self.createWidgets() 

Im Falle der Verwendung eines Standard-Strings läuft das Programm gut, bis Sie auf die Checkbutton klicken, an welcher Stelle der Checkbutton grau wird, dann hört das Programm auf zu reagieren. Im Falle der Verwendung des StringVar () wird das tk-Fenster überhaupt nicht geladen, da dieser Rahmen bei der Initialisierung des Fensters initialisiert wird. Vielen Dank für Ihre Hilfe und wenn Sie möchten, dass der vollständige Code zu helfen, das Problem zu finden, lassen Sie mich einfach wissen.

2 Solutions collect form web for “Python 3.4 tkinter checkbutton variable handhabung funktioniert nicht und antwortet”

Hier ist eine heruntergekommene Version Ihres Codes, die richtig funktioniert:

 #!/usr/bin/env python ''' Toggle disable / normal of Tkinter widgets Written by PM 2Ring & R. Murray 2015.11.15 See http://stackoverflow.com/q/33711472/4014959 ''' #Python 3 / Python 2 Tkinter import try: import tkinter as tk except ImportError: import Tkinter as tk class CActivity(tk.Frame): def today_cb(self): if self.todayVar.get(): state = "disabled" else: state = "normal" #print(state) self.day.configure(state=state) self.month.configure(state=state) self.year.configure(state=state) def create_widgets(self): title_text = ("Click the 'Today' Checkbutton to\n" "disable / enable date Entry widgets") title = tk.Label(self, text=title_text) title.grid(row=0, column=0, sticky="W", padx=5, pady=5) self.todayVar = tk.IntVar() tk.Label(self,text="Today").grid(row=1, column=1, sticky="W", padx=0, pady=5) today = tk.Checkbutton(self, variable=self.todayVar, command=self.today_cb) today.grid(row=2, column=1, sticky="W", padx=0, pady=5) #Date Entry widgets tk.Label(self,text="Day").grid(row=3, column=1, sticky="W", padx=2, pady=5) self.day = tk.Entry(self, width=2) self.day.grid(row=4, column=1, sticky="W", padx=2, pady=5) tk.Label(self,text="Month").grid(row=3, column=2, sticky="W", padx=2,pady=5) self.month = tk.Entry(self, width=2) self.month.grid(row=4, column=2, sticky="W", padx=2, pady=5) tk.Label(self,text="Year").grid(row=3, column=3, sticky="W", padx=2, pady=5) self.year = tk.Entry(self, width=4) self.year.grid(row=4, column=3, sticky="W", padx=2, pady=5) def __init__(self, parent): tk.Frame.__init__(self, parent) self.pack() self.parent = parent self.create_widgets() if __name__ == '__main__': master = tk.Tk() master.title("Disable widgets demo") frame = CActivity(master) master.mainloop() 

Es gibt ein paar Probleme mit deinem Code.

Ihre createWidgets Methode speichert das Datum Entry Widgets in lokale Variablen, zB day , aber sie müssen in self.day , wie self.day , so dass sie durch die Callback-Methode des Checkbutton zugegriffen werden können.

Ein weiteres Problem ist, dass Sie die .grid Methode auf der gleichen Zeile wie der Widget-Konstruktor aufrufen. Diese Methode gibt None

 day = tk.Entry(self,width=2).grid(row=4,column=1) 

Setzt day auf Keine.

Es ist ok, .grid (oder .pack ) auf der gleichen Zeile wie der Konstruktor zu verwenden, wenn du keinen Hinweis auf das Widget speichern musst, aber es wird einfach nicht funktionieren, wenn du diese Referenz .pack . 🙂

Ich habe die Callback-Methode des Checkbutton leicht vereinfacht, um die Checkbutton zu reduzieren. Ich habe den onvalue="ON",offvalue="OFF" im Konstruktor des Checkbutton , da die Voreinstellung 0 und 1 für diese Aufgabe, IMHO, ausreichend ist (aber fühlen Sie sich frei, es wieder zu ändern, wenn Sie möchten :)) , Und da wir einen numerischen Zustand verwenden, IntVar ich einen IntVar anstatt einen String oder StringVar.

Ich habe auch den Namen der Methoden geändert, um mich an PEP 8 Konventionen anzupassen.


Sie haben noch einige Verwirrung mit lokalen Variablen vs Instanzvariablen in Ihrem Code. day ist nicht das Gleiche wie self.day , also musst du das beheben, zB,

 day = tk.Entry(self,width=2) self.day.grid(row=4,column=1,sticky="W",padx=2,pady=5) 

muss sein

 self.day = tk.Entry(self,width=2) self.day.grid(row=4,column=1,sticky="W",padx=2,pady=5) 

textvariable auch, was Bryan Oakley über widget variable und textvariable Attribute, die einen Hinweis auf eine Instanz eines Tkinter StringVar , IntVar , etc.

Die variable und textvariable Attribute erfordern einen Verweis auf eine Instanz eines Tkinter StringVar , IntVar , DoubleVar oder BooleanVar . Sie können keine normalen Variablen verwenden.

Zweitens müssen Sie die get Methode dieser Variablen verwenden, um die Werte abzurufen, bevor sie in einer if Anweisung verglichen werden.

 self.todayVar = StringVar() ... today = tk.Checkbutton(..., variable=self.todayVar, ...) ... if self.todayVar.get() == "ON": 
  • Bindende Rückrufe zur Minimierung und Maximierung von Ereignissen in Toplevel-Fenstern
  • Numpy Matrix to tkinter Leinwand
  • Deaktivieren Sie das zugrunde liegende Fenster, wenn ein Popup in Python TKinter erstellt wird
  • Python Tkinter Stoppuhr Fehler
  • Wie kann man Tkinter Canvas löschen?
  • Progressbar in Tkinter mit einem Label innen
  • Warum funktioniert mein Programm mit einer .py-Erweiterung aber nicht mit einer .pyw-Erweiterung?
  • Zeichne ein Fenster in einem anderen
  • Python Tkinter Anwendung auf dem Bildschirm passen
  • Wie würde ich ein einfaches Verschlüsselungs- / Entschlüsselungsprogramm machen? [abgeschlossen]
  • Zugriff auf alternative Clipboard-Formate von Python
  • Python ist die beste Programmiersprache der Welt.