Hey, ich hoffe jmd vesteht meine Frage:
Ich versuche Radiobuttons einzubauen in mein kleines Programm (das hier noch nicht fertig ist, aber schon angefangen) ich vesteht aber nicht den dickgedruckten Teil, da ich zwar das fenster mit all den Widgets sehe aber immer fehlermeldungen kommen, wenn ich ein Button anklicke. (diese sagen mit var is not defined) ich weiß nur leider nicht wie ich das ändere letztendlich soll er mit anzeigen, welchen button ich gewählt habe in einem label das sagt: "Du nimmst also ..."
from Tkinter import *
class Rechentrainer:
# Widgets instanzieren ------------------------------
def __init__(self):
self.fenster = Tk()
self.fenster.title('RechenTrainer')
self.fenster.geometry('500x300')
self.titel = Label(master = self.fenster, text = 'Wie gut kannst du Kopfrechnen ?',
font = ('Jokerman', 20), fg = 'darkmagenta')
self.rahmen1 = Frame (master = self.fenster, relief = RIDGE, bd = 2)
self.alabel = Label(master = self.rahmen1, text = "Aufgabenanzahl: ")
self.scale = Scale(master = self.rahmen1, from_=5, to=25, cursor = "hand2", orient=HORIZONTAL)
self.rahmen2 = Frame (master = self.fenster, relief = RIDGE, bd = 2)
self.var = IntVar() :K
self.radiobutton1 = Radiobutton(master = self.rahmen2,text = "Addition +",variable=self.var, value=1,command=sel)
self.radiobutton2 = Radiobutton(master = self.rahmen2,text = "Subtraktion -",variable=self.var, value=2,command=sel)
self.radiobutton3 = Radiobutton(master = self.rahmen2,text = "Multiplikation x",variable=self.var, value=3,command=sel)
self.radiobutton4 = Radiobutton(master = self.rahmen2,text = "Division :",variable=self.var, value=4,command=sel)
self.label = Label(master = self.rahmen2)
self.layout()
self.fenster.mainloop()
# Layout der Widgets-------
def layout(self):
self.titel.pack()
self.alabel.pack(side = LEFT)
self.scale.pack()
self.rahmen1.pack()
self.radiobutton1.pack(anchor=W)
self.radiobutton2.pack(anchor=W)
self.radiobutton3.pack(anchor=W)
self.radiobutton4.pack(anchor=W)
self.label.pack()
self.rahmen2.pack()
def sel():
selection = "Du nimmst also " + str(self.var.get())
self.label.config(text = selection)
# Hauptprogramm ----------------
rechner = Rechentrainer()
Radiobutton und seine Variablen
1. Setz deine Programme wenn du hier postest bitte in die entsprechenden Python-Tags.
2. Bitte den TraceBack posten, wenn du die Fehlermeldung nicht verstehst.
Die Fehlermeldung sagt dir, das du irgendwo die Variable "var" nutzt welche aber in diesem Namensraum nicht existiert. Du hast warscheinlich das "self." davor vergessen.
Weitere Anmerkungen:
In Tkinter ist es nicht sonderlich praktisch Klassenobjekte mit einer "mainloop" eines "Tk"-Widgets zu versehen. Es sollte nur eine "mainloop" im gesamten Programm existieren und gehört damit ins Hauptprogramm. Das Hauptprogramm kennzeichnet man in Python mit der Bedingung "if __name__ == '__main__':", dort kann man dann entweder sein Hauptprogramm von einer definition Aufrufen zB. "main()" oder man schreibt es direkt darunter.
In das Hauptprogramm gehört dann die Instanzierung des "Tk"-Widgets und nicht in die Klasse. Da dein Taschenrechner eine Anwendung werden soll, ist es natürlich günstig wenn er eine eigene Oberfläche hat. Hierzu leitet man die Tachenrechner-Klasse am besten von tkinter.Frame ab und über gibt dann das "Tk"-Widget an den Konstrucktor.
Beispiel:
2. Bitte den TraceBack posten, wenn du die Fehlermeldung nicht verstehst.
Die Fehlermeldung sagt dir, das du irgendwo die Variable "var" nutzt welche aber in diesem Namensraum nicht existiert. Du hast warscheinlich das "self." davor vergessen.
Weitere Anmerkungen:
In Tkinter ist es nicht sonderlich praktisch Klassenobjekte mit einer "mainloop" eines "Tk"-Widgets zu versehen. Es sollte nur eine "mainloop" im gesamten Programm existieren und gehört damit ins Hauptprogramm. Das Hauptprogramm kennzeichnet man in Python mit der Bedingung "if __name__ == '__main__':", dort kann man dann entweder sein Hauptprogramm von einer definition Aufrufen zB. "main()" oder man schreibt es direkt darunter.
In das Hauptprogramm gehört dann die Instanzierung des "Tk"-Widgets und nicht in die Klasse. Da dein Taschenrechner eine Anwendung werden soll, ist es natürlich günstig wenn er eine eigene Oberfläche hat. Hierzu leitet man die Tachenrechner-Klasse am besten von tkinter.Frame ab und über gibt dann das "Tk"-Widget an den Konstrucktor.
Beispiel:
Code: Alles auswählen
import Tkinter
class Calculator(Tkinter.Frame):
def __init__(self, master):
Tkinter.Frame.__init__(self, master)
#...
#...
if __name__ == "__main__":
root = Tkinter.Tk()
calc = Calculator(root)
calc.pack(expand=True, fill="both")
root.mainloop()
Hat er doch, sogar Fett markiert. Ich vermute das entweder irgendwo in seinem Programm ein "self." zu viel oder zu wenig ist.
Im übrigen ist die gelinkte Seite nicht sehr schön, veraltet und für den Großteil was Tkinter betrifft nicht empfehlenswert. Dann doch lieber http://effbot.org/tkinterbook/ - auch veraltet kommen "apply"s hin und wieder vor, aber fachlich ganz in Ordnung.
Im übrigen ist die gelinkte Seite nicht sehr schön, veraltet und für den Großteil was Tkinter betrifft nicht empfehlenswert. Dann doch lieber http://effbot.org/tkinterbook/ - auch veraltet kommen "apply"s hin und wieder vor, aber fachlich ganz in Ordnung.
sorry dass ich den traceback vergessen habe .... bin noch nen "neuling" hier
also ich hab auf euren seiten, die ihr mir gegeben habt nen bisle geforscht und was verändert
der traceback lautet:
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "J:\RechenTrainer_button.py", line 62, in sel
a = self.colour.get()
NameError: global name 'self' is not defined
also ich hab auf euren seiten, die ihr mir gegeben habt nen bisle geforscht und was verändert
Code: Alles auswählen
#----------------------------------------------------
# Dateiname: RechenTrainer.py
#----------------------------------------------------
from Tkinter import *
class Rechentrainer:
# Widgets instanzieren ------------------------------
def __init__(self):
self.fenster = Tk()
self.fenster.title('RechenTrainer')
self.fenster.geometry('500x300')
self.titel = Label(master = self.fenster, text = 'Wie gut kannst du Kopfrechnen ?',
font = ('Jokerman', 20), fg = 'darkmagenta')
self.rahmen1 = Frame (master = self.fenster, relief = RIDGE, bd = 2)
self.alabel = Label(master = self.rahmen1, text = "Aufgabenanzahl: ")
self.scale = Scale(master = self.rahmen1, from_=5, to=25, cursor = "hand2", orient=HORIZONTAL)
self.rahmen2 = Frame (master = self.fenster, relief = RIDGE, bd = 2)
self.colour = IntVar()
self.radiobutton1 = Radiobutton(master = self.rahmen2,text = "Addition +",variable = self.colour, value="Add",command=sel)
self.radiobutton2 = Radiobutton(master = self.rahmen2,text = "Subtraktion -",variable = self.colour, value="2",command=sel)
self.radiobutton3 = Radiobutton(master = self.rahmen2,text = "Multiplikation x",variable = self.colour, value="3",command=sel)
self.radiobutton4 = Radiobutton(master = self.rahmen2,text = "Division :",variable = self.colour, value="4",command=sel)
self.label = Label(master = self.rahmen2)
self.layout()
self.fenster.mainloop()
# Layout der Widgets-------
def layout(self):
self.titel.pack()
self.alabel.pack(side = LEFT)
self.scale.pack()
self.rahmen1.pack()
self.radiobutton1.pack(anchor=W)
self.radiobutton2.pack(anchor=W)
self.radiobutton3.pack(anchor=W)
self.radiobutton4.pack(anchor=W)
self.label.pack()
self.rahmen2.pack()
def sel():
a = self.colour.get()
self.label.config(text = "Du nimmst also " + a)
# Hauptprogramm ----------------
rechner = Rechentrainer()
Exception in Tkinter callback
Traceback (most recent call last):
File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
return self.func(*args)
File "J:\RechenTrainer_button.py", line 62, in sel
a = self.colour.get()
NameError: global name 'self' is not defined
Sagte ich ja, self zu wenig . Die OOP Grundlagen sollte man schon können bevor man mit GUIs anfängt.
Jetzt sieht man es auch, hier inDeine Funktion muss weiter eingerückt werden und in der Paramterliste muss ein "self" ergänzt werden.
Und sieh dir bitte nochmal meine weiteren Anmerkungen im ersten Post an.
Jetzt sieht man es auch, hier in
Code: Alles auswählen
def sel():
a = self.colour.get()
self.label.config(text = "Du nimmst also " + a)
Und sieh dir bitte nochmal meine weiteren Anmerkungen im ersten Post an.