Werte von Radiobuttons verarbeiten

Fragen zu Tkinter.
Antworten
GMM
User
Beiträge: 1
Registriert: Dienstag 2. April 2019, 12:14

Moin, moin

mein Programm besteht aus 2 Radiobuttons sowie einem normalen Button. Wenn 1 Radiobutton ausgewählt wurde, kann mit dem Normalen-Button ("Check-Button") die Ausführung erprüft werden. Das funktioniert auch, wenn ich die Radiobuttons im Hauptcode erzeuge.

Code: Alles auswählen

import tkinter as tk

def parameter():
  anzahl_peltier = peltier_ebenen()
  
  print(anzahl_peltier)

def peltier_ebenen():
    
    if Ebenen.get() == 1:
        return 4
    elif Ebenen.get() == 2:
        return 8
 
fenster = tk.Tk()  
fenster.title("SimGUI")
fenster.geometry("500x500")


Ebenen=tk.IntVar()

radio1 = tk.Radiobutton(fenster,text="1 Ebene", variable=Ebenen, value=1)
radio1.pack()
radio2 = tk.Radiobutton(fenster,text="2 Ebenen", variable=Ebenen, value=2)
radio2.pack()

check = tk.Button(text="Check",command=parameter)
check.pack()

fenster.mainloop()

Wenn ich die Erzeugung der Radiobuttons in eine Eigenefunktion (def Button) packe, dann wird in einer weiteren Funktion (def peltier_ebenen), in der die Values des Radiobuttons ausgelesen werden soll, Ebenen.get() nicht mehr erkannt.

Beziehungsweise der Code lässt sich noch ausführen, es wird lediglich der selbe Wert für beide Radiobuttons ausgegeben.

Code: Alles auswählen

import tkinter as tk

def parameter():
  anzahl_peltier = peltier_ebenen()
  
  print(anzahl_peltier)

def peltier_ebenen():
    
    if Ebenen.get() == 1:
        return 4
    elif Ebenen.get() == 2:
        return 8

def Button():
    
    fenster = tk.Tk()  
    fenster.title("SimGUI")
    fenster.geometry("500x500")
    
    
    Ebenen=tk.IntVar()
    
    radio1 = tk.Radiobutton(fenster,text="1 Ebene", variable=Ebenen, value=1)
    radio1.pack()
    radio2 = tk.Radiobutton(fenster,text="2 Ebenen", variable=Ebenen, value=2)
    radio2.pack()
    
    check = tk.Button(text="Check",command=parameter)
    check.pack()
    
    fenster.mainloop()
    
Button()

Wo genau liegt mein Fehler?

Ich hoffe ich konnte mich deutlich genug ausdrücken

Vielen Dank für die Hilfe
Gerrit
Sirius3
User
Beiträge: 18328
Registriert: Sonntag 21. Oktober 2012, 17:20

Bei GUI-Programmierung kommt man fast nicht um die Definition von Klassen herum.
Behelfsweise könnte man hier noch mit functools.partial arbeiten und `Ebenen` als Argument der Funktion `parameter` übergeben.
Benutzeravatar
__blackjack__
User
Beiträge: 14226
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@GMM:`Ebenen` ist dann nicht mehr global definiert – gut so! – sondern nur noch lokal in der `Button`-Funktion. Alles was Funktionen und Methoden ausser Konstanten verwenden sollte als Argument(e) übergeben werden. Wie Sirius schon sagte: Regelt man das entweder über Klassen oder mit `functools.partial()`.

Die Namen sind teilweise schlecht. In Python schreibt mal Namen klein_mit_unterstrichen, ausgenommen Konstanten (KOMPLETT_GROSS) und Klassen (MixedCase). Und Funktionsnamen beschreiben üblicherweise die Tätigkeit die diese Funktion durchführt. `Button` wäre also ein Klassenname (wie das bei `tkinter.Button` ja auch der Fall ist) und `button` kleingeschrieben wäre ein guter Name für einen generischen `Button`, aber sicher nicht für eine Funktion. Da steht das Hauptprogramm drin, welches traditionell `main()` genannt wird.

Wenn einem da nichts passenderes einfällt, geht bei Rückruffunktionen für Ereignisse auch `on_irgendwas()`, also generisch für einen `button` so etwas wie `on_button()`. Und auch `peltier_ebenen` ist kein guter Name für eine Funktion.
“Ich bin für die Todesstrafe. Wer schreckliche Dinge getan hat, muss eine angemessene Strafe bekommen. So lernt er seine Lektion für das nächste Mal.” — Britney Spears, Interview in der französischen Zeitung Libération, 2. April 2002
Antworten