Seite 1 von 1

aktualisieren einer Checkbutton-Variable

Verfasst: Freitag 17. November 2017, 23:10
von Goswin
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()

Re: aktualisieren einer Checkbutton-Variable

Verfasst: Samstag 18. November 2017, 10:42
von Sirius3
@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.

Re: aktualisieren einer Checkbutton-Variable

Verfasst: Samstag 18. November 2017, 19:23
von Goswin
@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?

Re: aktualisieren einer Checkbutton-Variable

Verfasst: Samstag 18. November 2017, 19:32
von __deets__
Du musst einen trace auf der int var setzen welcher den Wert wie gewünscht auf der anderen setzt. Also ja, ein callback.

Re: aktualisieren einer Checkbutton-Variable

Verfasst: Sonntag 19. November 2017, 22:39
von Goswin
__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"?