Seite 1 von 1

Radiobutton in Klasse

Verfasst: Mittwoch 16. Oktober 2019, 15:31
von Gerry
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()

Re: Radiobutton in Klasse

Verfasst: Mittwoch 16. Oktober 2019, 17:38
von Sirius3
@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.

Re: Radiobutton in Klasse

Verfasst: Donnerstag 17. Oktober 2019, 16:27
von Gerry
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.