Radiobutton in Klasse

Fragen zu Tkinter.
Antworten
Gerry
User
Beiträge: 3
Registriert: Dienstag 1. Oktober 2019, 12:47

Die unten aufgeführten Beispiele laufen unter Windows 10 mit Python 3.7.4 und Tkinter.
Die unten aufgeführten Beispiele wurde aus einem umfangreicheren Programm reduziert und sollen nur das Problem verdeutlichen.
Das 1. Beispiel funktioniert. Wenn ich jedoch den gleichen Code in einer Klasse ausführe enthält die Variable 'wert'
und somit 'anzeige' immer 0. Das gleiche Problem habe ich mit Checkbuttons. Habe unterschiedliche Varianten versucht. komme einfach nicht dahinter. Hilfe !

1. Beispiel Wert enthält 2, 3 oder 5 wie gewünscht

Code: Alles auswählen

from tkinter import *

fenster2 = Tk()
fenster2.title('Radio')
fenster2.geometry('420x225')

# Rahmen Radiobutton
rahmen = Frame(fenster2)
rahmen.place(x=5, y=5, width=310, height=180)

def Click():
    anzeige = str(wert.get()) 
    labelText.config(text=anzeige)

def callback(*args):	# Funktion wird aufgerufen wenn wert wechselt
	print(wert.get())	# 

wert = IntVar()

# Radiobutton
radiobutton1 = Radiobutton(rahmen, anchor='w', text='kleine Menge', value=2, variable=wert, command=Click)
radiobutton1.place(x=5, y=30, width=100, height=20)

radiobutton2 = Radiobutton(rahmen, anchor='w', text='mittlere Menge', value=3, variable=wert, command=Click)
radiobutton2.place(x=5, y=50, width=100, height=20)

radiobutton3 = Radiobutton(rahmen, anchor='w', text='grosse Menge', value=5, variable=wert, command=Click)
radiobutton3.place(x=5, y=70, width=100, height=20)

radiobutton1.select()

# Label Text
labelText = Label(rahmen, text=str(wert.get()) + ' Liter')
labelText.place(x=5, y=5, width=100, height=20)

wert.trace('w', callback) # Wird aufgerufen wenn wert wechselt

fenster2.mainloop()

2. Beispiel: Wert immer Null

Im 2. Beispiel wird aus einem Menü die Klasse 'radio' aufgerufen:

Zuerst das Menü in der Datei 'menue.py'. In der Variablen 'wert' steht immer Null.

Code: Alles auswählen

from tkinter import *
from radio import *

def radio():
	app=radio=Radio()
	app.radio()

fenster=Tk()
fenster.geometry("850x850")
fenster.title("Beispiel-Menue")

rahmen=Frame(fenster, relief="ridge", borderwidth=5)
rahmen.pack(fill="both", expand=1)

menubar = Menu(fenster)

dateimenu = Menu(menubar, tearoff=0)
dateimenu.add_command(label="Radio- Checkbutton", command=radio)
dateimenu.add_separator()
dateimenu.add_command(label="Ende", command=fenster.quit)

menubar.add_cascade(label="Datei", menu=dateimenu)

fenster.config(menu=menubar)
fenster.mainloop()
Dann die Klasse in der Datei 'radio.py'

Code: Alles auswählen

from tkinter import *

class Radio():
	def radio(self):
				
		fenster2 = Tk()
		fenster2.title('Radio')
		fenster2.geometry('420x225')

		# Rahmen Radiobutton
		rahmen = Frame(fenster2)
		rahmen.place(x=5, y=5, width=310, height=180)

		def Click():
			anzeige = str(wert.get())
			labelText.config(text=anzeige)

		def callback(*args):	# Funktion wird aufgerufen wenn wert wechselt
			print(wert.get())	# 

		wert = IntVar()

		# Radiobutton
		radiobutton1 = Radiobutton(rahmen, anchor='w', text='kleine Menge', value=2, variable=wert, command=Click)
		radiobutton1.place(x=5, y=30, width=100, height=20)

		radiobutton2 = Radiobutton(rahmen, anchor='w', text='mittlere Menge', value=3, variable=wert, command=Click)
		radiobutton2.place(x=5, y=50, width=100, height=20)

		radiobutton3 = Radiobutton(rahmen, anchor='w', text='grosse Menge', value=5, variable=wert, command=Click)
		radiobutton3.place(x=5, y=70, width=100, height=20)

		radiobutton1.select()

		# Label Text
		labelText = Label(rahmen, text=str(wert.get()) + ' Liter')
		labelText.place(x=5, y=5, width=100, height=20)

		wert.trace('w', callback) # Wird aufgerufen wenn wert wechselt

		fenster2.mainloop()
Sirius3
User
Beiträge: 17750
Registriert: Sonntag 21. Oktober 2012, 17:20

@Gerry: *-Importe benutzt man nicht, weil man sich da unkontrollierbar hunderte Namen in den eigenen Namensraum schaufelt. Tkinter wird üblicherweise als ›import tkinter as tk‹ eingebunden und alle Namen über tk.xyz referenziert.

Eingerückt wird immer mit 4 Leerzeichen pro Ebene, keine Tabs.
In einem Programm darf es nur genau ein ›tk.Tk‹-Objekt geben und daher auch nur einmal ›mainloop‹.
Will man weitere Fenster benutzt man ›tkTopLevel‹.

Dann hast Du keine Klasse, sondern nur eine Funktion, die Du in einen Klassennamensraum gepackt hast, in der Du nochmal Funktionen geschachtelt hast.
Jede nicht-triviale GUI braucht aber echte Klassendefinitionen.

Am Besten lernst Du erstmal, wie man mit Klassen arbeitet, bevor Du hier weiter machst.
Gerry
User
Beiträge: 3
Registriert: Dienstag 1. Oktober 2019, 12:47

Danke für die Antwort. Habe die Zeile 'fenster2 = Tk()' in der Datei 'radio.py' durch 'fenster2 = Toplevel()' ersetzt. Dadurch bekomme ich erstmal das gewünschte Ergebnis. Sehe mir noch die anderen Empfehlungen an.
Antworten