PyGtk:破坏组合框会导致错误

时间:2016-08-08 10:25:04

标签: python-2.7 gtk pygtk

我的目标是在其中一个项目处于活动状态时销毁组合框。

我写了这个测试代码:

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()

3 个答案:

答案 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小部件,因为以后您可能希望再次显示它们。