Rückgabe eines Wertes vom 2. Fenster ans 1. Fenster

Fragen zu Tkinter.
Antworten
rodiboki
User
Beiträge: 8
Registriert: Freitag 17. Mai 2024, 12:58

Hallo,

ich habe nochmal eine Frage: Wieso wird '0' Ausgegeben, wenn ich bei den Radiobutton '1' auswähle ?
Und was muss im Script geändert werden?

Code: Alles auswählen


import tkinter as tk

def main():
    root = tk.Tk()
    root.title("Test")

    label = tk.Label(root, text="Zeit Test")
    quitbutton = tk.Button(root, text='Quit', command=root.quit)

    label.pack()
    quitbutton.pack()

    abfrage()
    root.mainloop()
    root.destroy()


def abfrage():
    sub_root = tk.Tk()
    v = tk.IntVar()

    glabel = tk.Label(sub_root, text="""Choose:""")
    gradio1 = tk.Radiobutton(sub_root, text="Null", variable=v, value=0)
    gradio2 = tk.Radiobutton(sub_root, text="Eins", variable=v, value=1)
    button = tk.Button(sub_root, text='weiter', command=sub_root.quit)

    glabel.pack()
    gradio1.pack()
    gradio2.pack()
    button.pack()

    sub_root.mainloop()
    retval = v.get()
    sub_root.destroy()
    print("Wahl: ", retval)

if __name__ == "__main__":
    main()
    
Gruß
Mathias
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

Da gibt es erst einmal ein grundlegendes Problem:
Es darf nur einen(!) mainloop in einem Tkinter-Programm geben. Die Schleife ist nicht dazu da, um Fenster zu öffnen sondern rendert alle Tk-Componente.
Wenn du ein neues Fenster anzeigen möchtest, nutze "Toplevel".
Benutzeravatar
__blackjack__
User
Beiträge: 13919
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Das `root.destroy()` nach dem `mainloop()`-Aufruf ist überflüssig. `sub_root.destroy()` auch, denn zur Ausführung dieser Anweisung kommt man ja erst wenn der Benutzer das Fenster geschlossen hat, was gleichbedeutend mit zerstört ist.

Dieses getrennte Widgets erstellen und dann in einem nächsten Block anordnen mag irgendwie sauber aussehen, macht aber unnötig Arbeit wenn man Teile aus so einer Funktion heraus ziehen will, weil dann Code der eigentlich zusammengehört in verschiedenen ”Blöcken” steht. Zudem muss man auch nicht jeden Zwischenwert an einen Namen binden und wenn man das nicht macht, muss man sich auch keine sinnvollen Namen dafür ausdenken oder auf so etwas wie nummerierte Namen zurückfallen.

Namen sollten keine kryptischen Abkürzungen oder Zusätze enthalten. Was soll das `g` in `glabel` und `gradio` hier denn überhaupt bedeuten?

Code: Alles auswählen

import tkinter as tk


def auswerten(window, variable):
    print("Wahl:", variable.get())
    window.destroy()


def abfragen():
    window = tk.Toplevel()
    variable = tk.IntVar()
    tk.Label(window, text="Wähle:").pack()
    tk.Radiobutton(window, text="Null", variable=variable, value=0).pack()
    tk.Radiobutton(window, text="Eins", variable=variable, value=1).pack()
    tk.Button(
        window, text="Weiter", command=lambda: auswerten(window, variable)
    ).pack()


def main():
    root = tk.Tk()
    root.title("Test")

    tk.Label(root, text="Zeit Test").pack()
    tk.Button(root, text="Beenden", command=root.quit).pack()

    abfragen()
    root.mainloop()


if __name__ == "__main__":
    main()
“I am Dyslexic of Borg, Your Ass will be Laminated” — unknown
rodiboki
User
Beiträge: 8
Registriert: Freitag 17. Mai 2024, 12:58

Hallo,

Vielen Dank __blackjack__ und sparrow für die Hilfe bzw. Infos....

Jetzt komme ich wieder ein Stück weiter. Super...
Es kommen bestimmt noch ein paar Fragen von mir... :D

Der Code-Schnipel sind nur kleine Testprogramme zum ausprobieren und da mache ich mir über über Namen noch keine Gedanken.
Ich bin bei einem größeren Projekt bei und dort sind die Namen der Variablen/Kostanten schon selbsterklärend, was diese zu bedeuten hat.

Gruß
Mathias
Benutzeravatar
sparrow
User
Beiträge: 4501
Registriert: Freitag 17. April 2009, 10:28

@rodiboki: Mach dir jetzt Gedanken um Namen. Gewöhn es dir gleich an. Das frisst kein Brot und geht dann hoffentlich in Gewohnheit über.
Antworten