2016-03-05 88 views
1

我正在使用PyGtk 2.0。在我的程序中,我创建了一个包含Combobox的对话框。该对话框没有OK或Cancel按钮。当组合框中的项目被选中时,对话框必须关闭(意味着在onchange事件中)。但是我不能在没有手动关闭操作的情况下销毁对话框。如何关闭组合框事件更改时的GTK对话?

我的相关代码:

def mostrar_combobox(self, titulo, texto_etiqueta, lista): 
    """ 
    MÃ © All to show a combobox on screen and get the option chosen 
    """ 
    #print texto_etiqueta 
    #dialogo = gtk.Dialog(titulo, None, 0, (gtk.STOCK_OK, gtk.RESPONSE_OK, gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL)) 
    dialogo = gtk.Dialog(titulo, None, gtk.DIALOG_MODAL, None) 
    etiqueta = gtk.Label(texto_etiqueta) 
    etiqueta.show() 
    dialogo.vbox.pack_start(etiqueta) 
    combobox = gtk.combo_box_new_text() 
    for x in lista: 
     combobox.append_text(x) 
    combobox.connect('changed', self.changed_cb) 
    #combobox.set_active(0) 
    combobox.show() 
    dialogo.vbox.pack_start(combobox, False) 
    response = dialogo.run() 

    elemento_activo = combobox.get_active() 

    return elemento_activo 

    dialogo.hide() 

def changed_cb(self, combobox): 
    index = combobox.get_active() 
    if index > -1: 
     print index 

请告知如何能onchange后关闭的。

我在这里发表的示例代码:http://pastie.org/10748579

但我主要的应用程序我无法重现相同。

+2

ANES,我注意到,有5年多问题,你还没有接受任何答案。我希望你知道,作为提问者,你有选择权(和责任)来标记解决你的问题的答案。您可以通过点击每个答案左侧的刻度线来做到这一点,这样做会为您和提问者都赢得声誉。提升和接受答案是你可以感谢那些帮助你的人(提出好的答案,并接受解决你的问题的答案)的方式。 –

回答

1

下面是一个简单的例子,它可以做你想做的事。我使用你的一些代码,我写了几年的代码和一些新的东西来构建它。

#!/usr/bin/env python 

''' Create a GTK Dialog containing a combobox that closes 
    when a combobox item is selected 

    See http://stackoverflow.com/q/35812198/4014959 

    Written by PM 2Ring 2016.03.05 
''' 

import pygtk 
pygtk.require('2.0') 
import gtk 

lista = ('zero', 'one', 'two', 'three') 

class Demo: 
    def __init__(self): 
     self.win = win = gtk.Window(gtk.WINDOW_TOPLEVEL) 
     win.connect("destroy", lambda w: gtk.main_quit()) 

     button = gtk.Button("Open dialog") 
     button.connect("clicked", self.dialog_button_cb) 
     win.add(button) 
     button.show() 

     self.dialog = gtk.Dialog("Combo dialog", self.win, 
      gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT, 
      (gtk.STOCK_CANCEL, gtk.RESPONSE_REJECT)) 

     combobox = gtk.combo_box_new_text() 
     for s in lista: 
      combobox.append_text(s) 
     combobox.connect("changed", self.combo_cb) 
     self.dialog.action_area.pack_end(combobox) 
     combobox.show() 

     win.show() 

    def dialog_button_cb(self, widget): 
     response = self.dialog.run() 
     print "dialog response:", response 
     self.dialog.hide() 
     return True 

    def combo_cb(self, combobox): 
     index = combobox.get_active() 
     if index > -1: 
      print "combo", index, lista[index] 
      self.dialog.response(gtk.RESPONSE_ACCEPT) 
     return True 

def main(): 
    Demo() 
    gtk.main() 


if __name__ == "__main__": 
    main() 

测试上的Python 2.6.6,GTK版本2.21.3

+0

亲爱的主席先生, 你的代码工作太棒了......非常感谢 Anes – Anes