Seite 1 von 1

RadioButton führt Funktion 2x aus ?

Verfasst: Sonntag 15. November 2009, 00:56
von w.olle
Hallo,
ich brauche mal eure Hilfe. Ich bin vor kurzen mit Python/ Glade angefangen, und versuche mich an meinem ersten Programm mit GUI.

Ich habe mehrere Buttons die einwandfrei funktionieren. Nur die RadioButtens machen mir Probleme.
Wenn ich den RadioButton betätige wird mit dem Signal Toggled eine Variable gesetzt und eine Funktion aufgerufen,
die diese dann verwendet. Die Funktion wird aber 2 X ausgehührt ! Warum, bzw. wie kann man das verhindern ?
Liegt es evtl. daran, dass ich wiederum eine Funktion aufrufe ?

Es sieht ungefähr so aus:

Code: Alles auswählen

def alles_toggled(self, widget):
        self.Variable=A
        self.Funktion_ausführen(self, widget)

def gefiltert_toggled(self, widget):
        self.Variable=B
        self.Funktion_ausführen(self, widget)

def Funktion_ausführen(self, widget):
        print self.Variable
Vielen Dank im Vorraus,
Wolle

Verfasst: Sonntag 15. November 2009, 05:10
von BlackJack
@w.olle: Ein minimales, lauffähiges Beispiel wäre nicht schlecht. Man sollte zumindest sehen können, wie Du die GUI einbindest.

Verfasst: Sonntag 15. November 2009, 18:02
von w.olle
Hallo,
ich hatte mich auf das Minimum beschränkt, da das gesamte Programm bereits 310 Zeilen fasst.
Ich muss aber zugeben, dass es durchaus Sinn gemacht hat nochmal ein lauffähiges Prog. zu machen, denn das Problem stellt sich ein wenig anders dar:
Wenn ich den normalen button betätige bekomme ich die Ausgabe:
D (Das ist auch OK)
Wenn ich den Radiobutton2 betätige, so bekomme ich die Ausgabe:
A
B
Bei Radiobutton1 wieder
B
A
Ich möchte eigentlich nicht 2 Signale (Änderung von Button-X zu Button-Y), sondern nur ein Signal (Button-Y).

Code: Alles auswählen

# -*- coding: cp1252 -*-

try:
	import pygtk
	pygtk.require("2.0")

except:
	pass

try:
	import gtk
	import gtk.glade

except:
	print "GTK kann nicht geladen werden !!"
	sys.exit(1)

class gui:
        
        def __init__(self): 
                self.Variable="D"
                self.gladefile = "GUI.glade"
                self.wTree = gtk.glade.XML(self.gladefile, "mainWindow")
                
                dic = { "destroy" : self.ENDE,
                        "on_button1_toggled" : self.on_button1_toggled,
                        "on_button2_toggled" : self.on_button2_toggled,
                        "on_button3_toggled" : self.on_button3_toggled,
                        "on_Funktion_ausfuehren_clicked" : self.on_Funktion_ausfuehren_clicked,
                        "on_MainWindow_destroy" : self.ENDE }
                self.wTree.signal_autoconnect(dic)

        def on_button1_toggled(self, widget):
                self.Variable="A"
                self.on_Funktion_ausfuehren_clicked("")

        def on_button2_toggled(self, widget):
                self.Variable="B"
                self.on_Funktion_ausfuehren_clicked("")

        def on_button3_toggled(self, widget):
                self.Variable="C"
                self.on_Funktion_ausfuehren_clicked("")

        def on_Funktion_ausfuehren_clicked(self, widget):

               print self.Variable

        def ENDE(self, widget):
                ### EXIT ###
                gtk.main_quit()

if __name__ == "__main__":
        dect = gui()
        gtk.main()
Gruß,
Wolle

Verfasst: Sonntag 15. November 2009, 18:19
von ms4py
Das Signal 'toggled' wird immer ausgelöst, sobald sich der Wert eines Buttons ändert. Bei Radiobuttons wird das dann natürlich bei beiden Buttons ausgelöst, wenn die in einer Gruppe sind.
Entweder du verwendest ein anderes Signal ('activated') oder du überprüfst in der Callback, ob der Button aktiv ist oder nicht.
Wie gesagt, das Programm verhält sich genau richtig.

Schau dir außerdem mal die PEP8 an. (z.B.: Variablennamen schreibt man klein_mit_unterstrich und Klassen CamelCase)

P.S. größere Quelltext kann bzw. sollte man auslagern, z.B. http://paste.pocoo.org

Verfasst: Sonntag 15. November 2009, 18:48
von w.olle
OK,
ich hatte es mir schon fast gedacht. Klingt ja auch logisch toggle heißt ja umschalten.
Danke für die schnelle Hilfe. SUPER !!

Gruß,
Wolle

Verfasst: Sonntag 15. November 2009, 22:22
von w.olle
Hallo,
ich habe gerade nach "activated" geschaut. Im Glade wird nur "activate" angeboten. Evtl. meintest du das.
Möchte nur zur Vollständigkeit erwähnen, das "activate" kein gutes Signal für die Radiobutton ist,
da man nach dem anklicken des buttons nochmal die Eingabetaste bzw. Leertaste betätigen muss um das Signal zu erhalten.

"clicked" verhältsich ebenso wie "toggled".

Das Signal "pressed" funktioniert, und liefert nur das Signal für den augewählten Radiobutton.
Man muss allerdings die Maus zum selektieren verwenden. Evtl. sollte man es mit "activate" kombinieren,
damit der Benutzer auch die Tastatur verwenden kann.

So, ich hoffe meine Antwort auf meine eigene Frage hilft auch anderen :D
Gruß,
Wolle

Verfasst: Sonntag 15. November 2009, 22:35
von ms4py
Oder du überprüfst mit "toggled" welcher Button aktiv ist...