我的目标是在其中一个项目处于活动状态时销毁组合框。
我写了这个测试代码:
import pygtk
pygtk.require('2.0')
import gtk
import gobject
def remove(combobox):
if 'OptionC' in combobox.get_active_text():
combobox.destroy()
window = gtk.Window(gtk.WINDOW_TOPLEVEL)
window.set_default_size(800, 600)
window.set_title("Test")
window.connect("destroy", gtk.main_quit)
main_box = gtk.VBox(False, 2)
window.add(main_box)
nb = 3
for i in range(nb):
liststore = gtk.ListStore(gobject.TYPE_STRING)
combo = gtk.ComboBox(liststore)
cell = gtk.CellRendererText()
combo.pack_start(cell, True)
combo.add_attribute(cell, 'text', 0)
for text in ["OptionA-%d"%(i+1), "OptionB-%d"%(i+1), "OptionC-%d"%(i+1)]:
combo.append_text(text)
combo.set_active(0)
combo.connect("changed", remove)
main_box.pack_start(combo, expand=False)
window.show_all()
gtk.main()
如果我打开组合框的弹出窗口并单击以选择" OptionC",我收到此消息:
combo.py:29: Warning: invalid unclassed pointer in cast to `GObject' gtk.main()
combo.py:29: Warning: g_object_notify: assertion `G_IS_OBJECT (object)' failed gtk.main()
combo.py:29: Warning: g_object_set: assertion `G_IS_OBJECT (object)' failed gtk.main()
但如果我选择" OptionC"只是责骂组合框(不打开弹出窗口),不会遇到任何错误。
感谢您的建议!
答案:(适用于pygtk 2.24但不适用于2.16)
替换此块:
liststore = gtk.ListStore(gobject.TYPE_STRING)
combo = gtk.ComboBox(liststore)
cell = gtk.CellRendererText()
combo.pack_start(cell, True)
combo.add_attribute(cell, 'text', 0)
通过这个功能:
combo = gtk.combo_box_new_text()
答案 0 :(得分:1)
这是因为你使用了一个列表库。
新的gtk代码现在应该使用combo_box_new_text()
这是你的代码工作:
for i in range(nb):
combo = gtk.combo_box_new_text()
cell = gtk.CellRendererText()
combo.pack_start(cell, True)
combo.add_attribute(cell, 'text', 0)
for text in ["OptionA-%d"%(i+1), "OptionB-%d"%(i+1), "OptionC-%d"%(i+1)]:
combo.append_text(text)
combo.set_active(0)
combo.connect("changed", remove)
main_box.pack_start(combo, expand=False)
window.show_all()
gtk.main()
答案 1 :(得分:0)
你的代码很扎实,小部件就像它们应该被破坏一样。把它写成pygtk / PyGObject的内存管理的奇怪之处。
答案 2 :(得分:0)
那么你为什么不使用
combobox.hide()
而不是
combobox.destroy()
似乎破坏个别小部件并不是你应该做的事情。在大多数情况下,我不会破坏Gtk小部件,因为以后您可能希望再次显示它们。