tags:

views:

886

answers:

2

Alright, I'll preface this with the fact that I'm a GTK and Python newb, but I haven't been able to dig up the information I needed. Basically what I have is a list of Radio Buttons, and based on which one is checked, I need to connect a button to a different function. I tried creating all my radio buttons, and then creating a disgusting if/else block checking for sget_active() on each button. The problem is the same button returns true every single time. Any ideas?

Here's the code in use:

 #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)
A: 

First, I presume that's a typo and you're actually calling get_active() in your code and not set_active()? Other than that, without seeing the code, I can point you to a pygtk tutorial about radio buttons

miles82
+3  A: 

Edit: (since you posted some code), just use:

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

and use that to look up in a dict of functions and call it:

my_actions[active]()


Edit: I totally forgot to mention that this is not a good use-case at all for RadioButtons, regular gtk.Button would be much better in my opinion.


Your answer is to use the RadioButton "groups" system. It is explained in this document, but here is a small practical example.

Firstly a group is really just a RadioButton itself that is used to collect a number of other RadioButtons. You specify a group as the first argument to the constructor.

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

Now all the radio buttons will be synchronised. And the matter of reading them is as easy as:

active_radios = [r for r in r1.get_group() if r.get_active()]
Ali A
You're right. Buttons are the way to go. Thanks for clearing my stupidity, and for the lessons on radio buttons!
f4nt