Pergunta

Tudo bem, eu vou prefácio isto com o fato de que eu sou um GTK e Python newb, mas eu não tenho sido capaz de desenterrar as informações que eu precisava. Basicamente o que eu tenho é uma lista de botões de rádio, e com base na qual é verificado, eu preciso ligar um botão para uma função diferente. Eu tentei criar todos os meus botões de rádio, em seguida, criar um nojento if / verificação bloco else para sget_active() em cada botão. O problema é o botão mesmos retornos verdade cada vez. Alguma idéia?

Aqui está o código em 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)
Foi útil?

Solução

Edit: (desde que você postou alguns códigos), basta usar:

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

e usar isso para olhar para cima em um dicionário de funções e chamá-lo:

my_actions[active]()

Edit:. Eu esqueci completamente de mencionar que este não é um bom caso de uso em tudo para RadioButtons, regulares gtk.Button seria muito melhor na minha opinião


A sua resposta é usar o sistema de RadioButton "grupos". É explicado em este documento , mas aqui é um pequeno exemplo prático.

Em primeiro lugar um grupo é realmente apenas um RadioButton em si que é usado para coletar uma série de outros RadioButtons. Você especificar um grupo como o primeiro argumento para o construtor.

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

Agora, todos os botões de rádio serão sincronizados. E a questão de lê-los é tão fácil como:

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

Outras dicas

Primeiro, eu presumo que é um erro de digitação e você está realmente chamando get_active () em seu código e não set_active ()? Fora isso, sem ver o código, eu posso apontar-lhe uma pygtk tutorial sobre botões de rádio

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top