Radiobutton und seine Variablen

Fragen zu Tkinter.
Antworten
haily
User
Beiträge: 2
Registriert: Mittwoch 6. April 2011, 14:00

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 :cry: 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()
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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:

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()
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
problembär

Du brauchst dafür ein "Tkinter.Variable()"-Objekt, z.B. so.

Gruß
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
haily
User
Beiträge: 2
Registriert: Mittwoch 6. April 2011, 14:00

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

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()
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
Xynon1
User
Beiträge: 1267
Registriert: Mittwoch 15. September 2010, 14:22

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 in

Code: Alles auswählen

def sel():
  a = self.colour.get()
  self.label.config(text = "Du nimmst also " + a)
Deine 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.
Traue keinem Computer, den du nicht aus dem Fenster werfen kannst.
Xynon auf GitHub
Antworten