Pregunta

De acuerdo, a Prefacio esto con el hecho de que soy un GTK y Novato Python, pero no he sido capaz de desenterrar la información que necesitaba. Básicamente lo que tengo es una lista de botones de radio, y en base a los cuales uno está marcado, lo que necesito para conectar un botón a una función diferente. He intentado crear todos mis botones de radio, y luego crear un desagradable si / bloque else comprobación de sget_active() en cada botón. El problema es el mismo botón true devuelve cada vez. ¿Alguna idea?

Este es el código en uso:

    #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)
¿Fue útil?

Solución

Editar: (puesto que envió algo de código), sólo tiene que utilizar:

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

y usar eso para buscar en un diccionario de funciones y llamarlo:

my_actions[active]()

Editar:. Se me olvidó mencionar que esto no es un buen uso de los casos en todo para RadioButtons, regulares gtk.Button sería mucho mejor en mi opinión


Su respuesta es utilizar el sistema de RadioButton "grupos". Se explica en este documento , pero aquí es un pequeño ejemplo práctico.

En primer lugar un grupo es realmente sólo un RadioButton misma que se utiliza para recoger una serie de otros RadioButtons. Se especifica un grupo como el primer argumento del 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

Ahora se sincronizarán todos los botones de radio. Y la cuestión de la lectura de ellos es tan fácil como:

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

Otros consejos

En primer lugar, supongo que es un error y en realidad se está llamando get_active () en el código y no set_active ()? Aparte de eso, sin ver el código, puedo señalar a un tutorial sobre pygtk botones de radio

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top