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: 17711
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: 13004
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.
“Most people find the concept of programming obvious, but the doing impossible.” — Alan J. Perlis
Antworten