checkbox abfragen

Fragen zu Tkinter.
Antworten
magifix
User
Beiträge: 29
Registriert: Samstag 20. Januar 2018, 16:45

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 ......
Benutzeravatar
__blackjack__
User
Beiträge: 13061
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
magifix
User
Beiträge: 29
Registriert: Samstag 20. Januar 2018, 16:45

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
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

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 ;-)
Take it easy Mates!
Sirius3
User
Beiträge: 17737
Registriert: Sonntag 21. Oktober 2012, 17:20

@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()
Benutzeravatar
wuf
User
Beiträge: 1529
Registriert: Sonntag 8. Juni 2003, 09:50

@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 *_
Take it easy Mates!
Antworten