我正在尝试使用Glade(GTK + 3)和Python在Ubuntu应用程序中实现下拉列表。 我可以显示ComboBoxText,填充字符串。然而,当我关闭窗口时,它被包含在内,然后重新打开它,组合框不在那里,只是一个完全空白的窗口。
我将有问题的ComboBoxText小部件添加到Glade中的窗口。 然后我在Python程序中添加了这段代码:
def on_button_edit_clicked(self, widget):
""" display list of events already stored, and allow deletion """
self.combo = self.builder.get_object('combo_box')
self.store = Gtk.ListStore(str)
self.store.append(['hello'])
self.store.append(['goodbye'])
self.combo.set_model(self.store)
event_editor = self.builder.get_object("event_editor")
event_editor.show()
我甚至尝试销毁小部件以查看是否有帮助:
def on_event_editor_destroy(self, widget):
self.combo.destroy()
self.store = Gtk.ListStore(str)
self.combo.set_model(self.store)
编辑:
我已经尝试了一些替代代码,包括一个CellRendererText对象,但仍然没有运气。
这些是我的来源: 我创建了Gtk.ListStore(),然后创建了Gtk.CellRendererText(),然后创建了Gtk.ComboBox()。 这完全符合示例13.3 here。
没有任何作用。当我第二次打开组合框窗口时,它只是一个空白窗口。有人可以帮忙吗?
答案 0 :(得分:1)
我找到了解决方案。我正在使用x按钮关闭窗口,该按钮必须一直在销毁小部件及其相关的列表存储。相反,我现在使用的是仅隐藏窗口的自定义按钮。
答案 1 :(得分:0)
标题上写着“Glade / GTK + 3 / Python中的ComboBoxText ......”然后你尝试实现一个GtkComboBox,而不是一个GtkComboBoxText。为什么用GtkComboBox折磨自己。
Glade文件(摘录)
<object class="GtkComboBoxText" id="comboboxtextEventEditor">
<property name="visible">True</property>
<property name="can_focus">False</property>
<property name="halign">end</property>
<property name="margin_right">10</property>
<property name="hexpand">True</property>
<property name="entry_text_column">0</property>
<property name="id_column">1</property>
<signal name="changed" handler="on_changed_event_editor" swapped="no"/>
</object>
请注意,GtkComboBoxText不需要GtkListStore。现在有些类方法
from __future__ import print_function
from gi.repository import Gtk
import os
def TheClass(Gtk.ApplicationWindow):
#class variable
UI_FILE = "preference.glade"
@staticmethod
def get_id():
return "windowTheClass"
def __init__(self, app):
""" Constructor"""
# Initialize class variables.
#app is an instance of a class which extends Gtk.Application
#Hardcode to have a working example code
self.ui_path = os.path.join("home", "useraccount", "Documents", "example")
#self.app = app
#self.ui_path = self.app.ui_path
# Load ui
self.__load_ui()
self.__initialize_event_editor_combobox()
def __load_ui(self):
self.builder = Gtk.Builder()
try:
strUIFile = os.path.join(self.ui_path, self.UI_FILE)
self.builder.add_from_file( strUIFile )
del strUIFile
self.win = self.builder.get_object( self.__class__.get_id() )
# This is not useful until Gtk version 3.6
#self.app.add_window(self.win)
self.builder.connect_signals(self)
except:
print(self.__class__.__name__ + ".__load_ui error", sys.exc_info()[1])
def __initialize_event_editor_combobox(self):
""" Populate event editor comboboxtext"""
combobox = self.builder.get_object("comboboxtextEventEditor")
combobox.remove_all()
# Args [position, id, text]
combobox.insert(0,"0", "Hello")
combobox.insert(0,"1", "goodbye")
combobox.set_active_id("1")
del combobox
def on_changed_event(self, widget, data=None):
""" combobox value selected. Refresh combobox"""
strSelectedEntry = widget.get_active_text()
print(self.__class__.__name__ + ".on_changed_event", strSelectedEntry)
#self.initialize_something_else(strSelectedEntry)
del strSelectedEntry