RadioButton führt Funktion 2x aus ?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
w.olle
User
Beiträge: 27
Registriert: Sonntag 15. November 2009, 00:28

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
BlackJack

@w.olle: Ein minimales, lauffähiges Beispiel wäre nicht schlecht. Man sollte zumindest sehen können, wie Du die GUI einbindest.
w.olle
User
Beiträge: 27
Registriert: Sonntag 15. November 2009, 00:28

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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
w.olle
User
Beiträge: 27
Registriert: Sonntag 15. November 2009, 00:28

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
w.olle
User
Beiträge: 27
Registriert: Sonntag 15. November 2009, 00:28

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
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

Oder du überprüfst mit "toggled" welcher Button aktiv ist...
Antworten