komisches Verhalten von Radiobuttons in Klassenstruktur

Fragen zu Tkinter.
Antworten
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

Hallo,

meine Radiobuttons funktionieren nicht so wie sie sollen, allerdings nur, wenn ich sie in einer Klassenstruktur habe:

Code: Alles auswählen

import tkinter

class MyApp:
    def __init__(self, root):
        root.wm_title("Koordinatensystem-Generator")
        ## Radiobuttons Nr. 1 & 2--------------------------------
        x_log = tkinter.IntVar()
        x_log.set (0)
        
        rb0 = tkinter.Radiobutton(root, variable = x_log, value = 0)
        rb0.grid(row=1, column=1)

        rb1 = tkinter.Radiobutton(root, variable = x_log, value = 1)
        rb1.grid(row=1, column=2)        

        ## Radiobuttons Nr. 3 & 4--------------------------------
        y_log = tkinter.IntVar()        
        y_log.set (0)

        rb2 = tkinter.Radiobutton(root, variable = y_log, value = 0)
        rb2.grid(row=2, column=1)

        rb3 = tkinter.Radiobutton(root, variable = y_log, value = 1)
        rb3.grid(row=2, column=2)
        ##-------------------------------------------------------
        
root = tkinter.Tk()
myapp = MyApp(root)
root.mainloop()
was passiert ist, daß beim Start kein einziger Button voreingestellt ist, dafür werden alle 4 Buttons grau mit schwarzem Punkt, wenn ich nur per "Mouseover" den Mauszeiger über die 4 Buttons bewege! Erst nachdem ich beide Buttonpaare angeklickt habe, funktionieren sie normal.

der gleiche Code, nur ohne Klassenstruktur funktioniert genau so wie er soll:

Code: Alles auswählen

import tkinter

root = tkinter.Tk()
root.wm_title("Koordinatensystem-Generator")

## Radiobuttons Nr. 1 & 2--------------------------------
x_log = tkinter.IntVar()
x_log.set (0)

rb0 = tkinter.Radiobutton(root, variable=x_log, value=0)
rb0.grid(row=1, column=1)

rb1 = tkinter.Radiobutton(root, variable=x_log, value=1)
rb1.grid(row=1, column=2)

## Radiobuttons Nr. 3 & 4--------------------------------
y_log = tkinter.IntVar()        
y_log.set (0)

rb2 = tkinter.Radiobutton(root, variable=y_log, value=0)
rb2.grid(row=2, column=1)

rb3 = tkinter.Radiobutton(root, variable=y_log, value=1)
rb3.grid(row=2, column=2)
##-------------------------------------------------------

root.mainloop()
Nachdem der 2. Code ja funktioniert, habe ich doch nix prinzipiell falsch gemacht? Vielleicht könnte das jemand verifizieren oder kennt das Problem...

Python Version ist 3.1!
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Es ist kein Problem von Python 3.1 - das gleiche passiert (optisch leicht abweichend) auch mit Python 2.5, 2.6 und 3.0.

Es genügt nicht, für die Kontrollvariablen (x_log und y_log) eine lokale Variable zu verwenden, sondern es muss eine Instanzvariable verwendet werden: self.x_log und self.y_log - dann funktioniert es wie gewünscht.
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

Code: Alles auswählen

import tkinter

class MyApp:
    def __init__(self, root):
        root.wm_title("Koordinatensystem-Generator")
        ## Radiobuttons Nr. 1 & 2--------------------------------
        self.x_log = tkinter.IntVar()
        self.x_log.set (1)
        
        rb0 = tkinter.Radiobutton(root, variable = self.x_log, value = 0)
        rb0.grid(row=1, column=1)

        rb1 = tkinter.Radiobutton(root, variable = self.x_log, value = 1)
        rb1.grid(row=1, column=2)        

        ## Radiobuttons Nr. 3 & 4--------------------------------
        self.y_log = tkinter.IntVar()        
        self.y_log.set (0)

        rb2 = tkinter.Radiobutton(root, variable = self.y_log, value = 0)
        rb2.grid(row=2, column=1)

        rb3 = tkinter.Radiobutton(root, variable = self.y_log, value = 1)
        rb3.grid(row=2, column=2)
        ##-------------------------------------------------------
        
root = tkinter.Tk()
myapp = MyApp(root)
myapp.x_log = 0
myapp.y_log = 0
root.mainloop()
meintest du so?

Es tritt leider das gleiche Fehlverhalten auf...
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

AntagonisT hat geschrieben:Es tritt leider das gleiche Fehlverhalten auf...
Klar, weil du es mit Zeile 29/30 produzierst ...
Nimm die beiden Zeilen heraus und alles ist gut.
AntagonisT
User
Beiträge: 42
Registriert: Samstag 11. Juli 2009, 16:36

shit, es funktioniert!

Jetzt muss ich nur noch verstehen, warum. :lol:

Danke!
Antworten