aktualisieren einer Checkbutton-Variable

Fragen zu Tkinter.
Antworten
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

Warum wird beim folgenden Code eine Änderung des Checkbuttons nicht automatisch im Label angezeigt?

Code: Alles auswählen

   import tkinter as t

   fenster = t.Tk()
   fenster.minsize(200,200)
   # 
   chbvar = t.IntVar();  chbvar.set(0)
   chb = t.Checkbutton(fenster,text="aktiv",variable=chbvar)
   chb.grid()
   #
   t.Label(fenster, text="chbvar = {}".format(chbvar.get()) ).grid()
   chb.grid()
   #
   fenster.mainloop()
Sirius3
User
Beiträge: 17712
Registriert: Sonntag 21. Oktober 2012, 17:20

@Goswin: weil Du einmal beim Erzeugen des Labels den Inhalt von `chbvar` ausliest.

Code: Alles auswählen

t.Label(fenster, textvariable=chbvar).grid()
`tkinter` wird üblicherweise mit `tk` abgekürzt. `t` ist für mich zu kurz und verwirrt.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

@Sirius3: Ich darf nicht "text" mit "textvariable" vewechseln; da hast du recht.

Aber das Ergebnis ist immer noch nicht wie erwünscht: ich möchte auf dem Label ja nicht einfach den Wert einer tk-Variablen sehen, sondern einen Textstring, wo dieser Wert eingebaut ist. Wenn ich folgendes definiere

Code: Alles auswählen

chbvar = tk.IntVar();  chbvar.set(0)
chbtxt = tk.StringVar();  chbtxt.set( "chbvar = {}".format(chbvar.get()) )
dann weiß ich nicht, wie ich das IntVar und das StringVar miteinander in Beziehung setzen soll; so wie angezeigt funktioniert das jedenfalls nicht! Geht so etwas nur über ein Callback?
__deets__
User
Beiträge: 14494
Registriert: Mittwoch 14. Oktober 2015, 14:29

Du musst einen trace auf der int var setzen welcher den Wert wie gewünscht auf der anderen setzt. Also ja, ein callback.
Benutzeravatar
Goswin
User
Beiträge: 363
Registriert: Freitag 8. Dezember 2006, 11:47
Wohnort: Ulm-Böfingen
Kontaktdaten:

__deets__ hat geschrieben:Also ja, ein callback.
Um ehrlich zu sein, ist dieser Teil der einzige, den ich von deinem Rat verstanden habe. Aber nach vielem Ausprobieren hat es trotzdem ausgereicht, wofür ich mich bedanke. Meine jetzige (funktionierende) Version ist

Code: Alles auswählen

   import tkinter as tk
   fenster = t.Tk()
   fenster.minsize(200,200)
   #  
   chbvar = tk.IntVar();  chbvar.set(0)
   chb = tk.Checkbutton(fenster,text="aktiv", variable=chbvar)
   chb.grid()
   #
   lbl = tk.Label(fenster)
   lbl.grid()
   chbvar.trace('w',lambda *args:
      lbl.config( text = "chbvar = {}".format(chbvar.get()) ))
Dennoch erhält tkinter von mir einen Preis für die schlechtest dokumentierte Software des Jahres. Bei einer Erklärung wie
trace = trace_variable(self, mode, callback)
Define a trace callback for the variable.

MODE is one of "r", "w", "u" for read, write, undefine.
CALLBACK must be a function which is called when
the variable is read, written or undefined.
Return the name of the callback.
verstehe ich (und wohl mancher tk-Unkundige) gerade einmal
bahnhof = haupt_bahnhof(self, lok, bahnhof)
Wie soll "trace_variable" verwendet werden? Was soll der Schwachsinn, ein Argument zu returnen, welches der Aufrufer sowieso kennt? Wenn ein IntVar nicht definiert wurde, wird eine Ausnahme ausgelöst, da hilft auch kein 'u' weiter. Und ist "trace_variable" dasselbe wie ein einfaches "trace"?
Antworten