Seite 1 von 1

checkbox abfragen

Verfasst: Sonntag 15. Juli 2018, 14:30
von magifix
Hallo, ich habe eine ckeckbox bei Tkinter eingesetzt
CheckVar1=tk.IntVar()
c1=tk.Checkbutton(text="Serie", variable=CheckVar1, onvalue=1, offvalue=0)
c1.place(y=645, x=120, width=80)
wie frage ich deren Zustand nun ab?
ich habe mit mal folgendes anzeigen lassen, egal ob akiviert oder nicht

print (CheckVar1)
Tkinter.intvar instance at ......

Re: checkbox abfragen

Verfasst: Sonntag 15. Juli 2018, 16:09
von __blackjack__
Die `*Var`-Datentypen haben `get()`- und `set()`-Methoden um den Wert der darin gekapselt ist, abzufragen oder zu setzen.

`place()` solltest Du nicht verwenden. GUIs mit absoluten Koordinaten werden zum absoluten Albtraum wenn man da einmal Änderungen vornehmen muss, und ob die auf anderen Systemen als auf dem wo man sie entworfen/getestet hat, richtig angezeigt werden, oder gar unbenutzbar sind, kann man auch nicht vorhersagen.

Die Namen sind schlecht gewählt. Weder `CheckVar1` noch `c1` verraten dem Leser was die Werte in dem Programm bedeuten. Das will man ja aber wissen wenn man das liest. `CheckVar1` ist zudem in MixedCase geschrieben, müsste also dem Namen nach eigentlich eine Klasse sein. Namen für alles ausser Klassen und Konstanten schreibt man in Python klein_mit_unterstrichen.

Edit: Falls die 0 und die 1 eigentlich für Wahrheitswerte stehen sollten: Es gibt auch `tk.BooleanVar`.

Re: checkbox abfragen

Verfasst: Sonntag 15. Juli 2018, 20:05
von magifix
Diesen Codeschnipsel hatte ich im Netz gefunden und 1:1 übernommen.
ich hatte übrigens mit place bessere Erfahrung als mit pack gemacht
was nun richtig ist weiß ich nun aber immer noch nicht

Re: checkbox abfragen

Verfasst: Sonntag 15. Juli 2018, 22:09
von wuf
Hi magifix

Hier etwas zum ausprobieren:

Code: Alles auswählen

from functools import partial
import tkinter as tk

APP_TITLE = "My first checkbox"
APP_XPOS = 100
APP_YPOS = 100
APP_WIDTH = 350
APP_HEIGHT = 200


def checkbox_callback(var_checkbox):
    print("Checkbox Status beim Anklicken:", var_checkbox.get())
            
def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)
    app_win.geometry("+{}+{}".format(APP_XPOS, APP_YPOS))
    app_win.geometry("{}x{}".format(APP_WIDTH, APP_HEIGHT))

    CheckVar1=tk.IntVar()
    c1=tk.Checkbutton(app_win, text="Serie", variable=CheckVar1, onvalue=1,
        offvalue=0, command=partial(checkbox_callback, CheckVar1))
    #c1.place(y=645, x=120, width=80)
    c1.pack(expand=True)
    
    # Setze die Checkbox auf wahr   
    CheckVar1.set(1)
    
    print("Checkbox Status beim Start:", CheckVar1.get())
    
    app_win.mainloop()
 
 
if __name__ == '__main__':
    main()
Gruss wuf ;-)

Re: checkbox abfragen

Verfasst: Montag 16. Juli 2018, 06:16
von Sirius3
@wuf: wenn man Variablen benutzt, fragt man am besten gleich deren Statusänderung ab:

Code: Alles auswählen

import tkinter as tk

APP_TITLE = "My first checkbox"

def series_callback(status):
    print("Checkbox Status:", status.get())

def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)

    series_checked = tk.BooleanVar(app_win, True)
    series_checked.trace("w", lambda *_: series_callback(series_checked))

    tk.Checkbutton(app_win, text="Serie", variable=series_checked).pack()
    app_win.mainloop()


if __name__ == '__main__':
    main()

Re: checkbox abfragen

Verfasst: Montag 16. Juli 2018, 15:15
von wuf
@Sirius3: Meine trace Variante;

Code: Alles auswählen

from functools import partial
import tkinter as tk

APP_TITLE = "My first checkbox"


def series_callback(status, *args):
    print("Checkbox Status:", status.get())

def main():
    app_win = tk.Tk()
    app_win.title(APP_TITLE)

    series_checked = tk.BooleanVar(app_win, True)
    series_checked.trace("w", partial(series_callback, series_checked))

    tk.Checkbutton(app_win, text="Serie", variable=series_checked).pack(padx=10,
        pady=10)
    app_win.mainloop()


if __name__ == '__main__':
    main()
Für mich ist *args besser lesbar als *_