2008-12-24 11 views
1

Très bien, je vais commencer par le fait que je suis un GTK et Python newb, mais je n'ai pas été en mesure de trouver l'information dont j'avais besoin. Fondamentalement ce que j'ai est une liste de boutons de radio, et basé sur lequel est vérifié, j'ai besoin de relier un bouton à une fonction différente. J'ai essayé de créer tous mes boutons radio, puis de créer un bloc if/else dégoûtant en vérifiant sget_active() sur chaque bouton. Le problème est le même bouton retourne vrai à chaque fois. Des idées?pyGTK Radio Button Aide

Voici le code utilisé:

#Radio Buttons Center 
    self.updatePostRadioVBox = gtk.VBox(False, 0) 
    self.updatePageRadio = gtk.RadioButton(None, "Updating Page") 
    self.updatePostRadio = gtk.RadioButton(self.updatePageRadio, "Updating Blog Post") 
    self.pageRadio = gtk.RadioButton(self.updatePageRadio, "New Page") 
    self.blogRadio = gtk.RadioButton(self.updatePageRadio, "New Blog Post") 
    self.addSpaceRadio = gtk.RadioButton(self.updatePageRadio, "Add New Space") 
    self.removePageRadio = gtk.RadioButton(self.updatePageRadio, "Remove Page") 
    self.removePostRadio = gtk.RadioButton(self.updatePageRadio, "Remove Blog Post") 
    self.removeSpaceRadio = gtk.RadioButton(self.updatePageRadio, "Remove Space") 


    #Now the buttons to direct us from here 
    self.returnMainMenuButton = gtk.Button(" Main Menu ") 
    self.returnMainMenuButton.connect("clicked", self.transToMain) 
    self.contentManageHBoxBottom.pack_start(self.returnMainMenuButton, False, False, 30) 
    self.contentProceedButton = gtk.Button(" Proceed ") 
    self.contentManageHBoxBottom.pack_end(self.contentProceedButton, False, False, 30) 

    if self.updatePageRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.updatePage) 

    elif self.updatePostRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.updatePost) 

    elif self.pageRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.newPage) 

    elif self.blogRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.newBlogPost) 

    elif self.addSpaceRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.newSpace) 

    elif self.removePageRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.removePage) 

    elif self.removePostRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.removeBlogPost) 

    elif self.removeSpaceRadio.get_active(): 
     self.contentProceedButton.connect("clicked", self.removeSpace) 

Répondre

7

Edit: (depuis que vous avez publié un code), il suffit d'utiliser:

active = [r for r in self.updatePageRadio.get_group() if r.get_active()][0] 

et l'utiliser pour consulter un dict de fonctions et de l'appeler:

my_actions[active]() 

Edit: Je suis totalement oublié de mentionner que ce n'est pas un bon cas d'utilisation du tout pour RadioButtons, gtk.Button régulière serait beaucoup mieux dans mon opinion.


Votre réponse est d'utiliser le système "groupes" RadioButton. Il est expliqué dans this document, mais voici un petit exemple pratique. Tout d'abord, un groupe n'est en fait qu'un RadioButton lui-même utilisé pour collecter un certain nombre d'autres RadioButtons. Vous spécifiez un groupe en tant que premier argument du constructeur.

r1 = gtk.RadioButton(None, label='Cat') # this has no group, it is the first 
r2 = gtk.RadioButton(r1, label='Mouse') # use the first radio 
             # button as the group argument 
r3 = gtk.RadioButton(r1, label='Dog') # again use r1 

Maintenant, tous les boutons radio seront synchronisés. Et la question de les lire est aussi simple que:

active_radios = [r for r in r1.get_group() if r.get_active()] 
+0

Vous avez raison. Les boutons sont le chemin à parcourir. Merci d'avoir nettoyé ma stupidité, et pour les leçons sur les boutons radio! – f4nt

+0

Mais si on veut que l'index dans le système de groupe RadioButton ne contienne qu'un actif à la fois, alors on peut faire 'active_radios = [int (i) pour i, r dans enumerate (inversé (r1.get_group())) si r.get_active()] '. Alors 'active_radios [0]' devrait donner l'index nécessaire. – enthusiasticgeek

0

D'abord, je présume que c'est une faute de frappe et vous appelez réellement get_active() dans votre code et non set_active()? A part cela, sans voir le code, je peux vous indiquer un tutoriel pygtk à propos radio buttons