免责声明:我不知道什么快,直到我读您的文章,或对一般的GUI编程为这一问题。因此,老实说,我没有生意要回答这个问题:)
也就是说,迅速是一个整洁的项目。我简要地浏览了样板代码源,并确定了以下用于添加ListStore支持的列表样式首选项的潜在方法:
- 'monkey-patch'获取并设置widget_methods到一个普通的TreeView窗口小部件(带有ListStore模型),如在data / ui / Preferences $ PROJECTNAME $ Dialog.ui中定义的那样。
- 实现
set_widget_from_preference
并set_preference
在项目的PreferencesDialog的子类中(子类为Preferences $ PROJECTNAME $ Dialog),当key
或是widget
ListStore支持的TreeView小部件时,执行不同的操作。
- 使用glade的匹配自定义小部件编写gtk.TreeView的自定义子类。
为了测试它们,我实现了所有这三个想法-每个想法都按预期工作,并且AFAICT完全相同。最后,第三个(特别是)对我来说似乎是最干净的,尽管起初期望相反,但它更接近整个样板中使用的约定。
这是我为第三步遵循的步骤...
通过quickly design
(第11 部分,第10 部分,快速地)使用glade ,然后松散地遵循本教程(第2部分),将ScrolledWindow小部件添加到Preferences $ PROJECTNAME $ Dialog.ui,将TreeView放到其上,命名为TreeView language_treeview
。出现提示时,为TreeView创建一个新的ListStore模型,并将其命名为language_liststore等。最终,我最终得到了这样的内容:
接下来,添加具有以下内容的林间空目录(data / ui / preferences_ $ PROJECTNAME $ _treeview.xml):
<glade-catalog name="preferences_$PROJECTNAME$_treeview" domain="glade-3"
depends="gtk+" version="1.0">
<glade-widget-classes>
<glade-widget-class title="$PROJECTNAME$ Preferences TreeView" name="Preferences$PROJECTNAME$TreeView"
generic-name="Preference$PROJECTNAME$TreeView" parent="GtkTreeView"
icon-name="widget-gtk-treeview"/>
</glade-widget-classes>
</glade-catalog>
然后,编辑Preferences $ PROJECTNAME $ Dialog.ui,添加...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
...在顶部,在require标签下。并将language_treeview的类属性更改为Preferences $ PROJECTNAME $ TreeView,以准备后续步骤。
最后,将以下元素添加到Preferences $ PROJECTNAME $ Dialog.py的widget_methods列表中
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
然后在同一文件(Preferences $ PROJECTNAME $ Dialog.py)的末尾添加
import gtk
ALL_LANGUAGES = [
'en', 'uk', 'de', 'fr', # ... much longer list
]
class Preferences$PROJECTNAME$TreeView(gtk.TreeView):
__gtype_name__ = "Preferences$PROJECTNAME$TreeView"
def __init__(self, *args):
super(Preferences$PROJECTNAME$TreeView, self).__init__(*args)
self.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
# loads the liststore with all languages,
# selecting/highlighting in the treeview those
# already retrieved from previously saved preferences
def set_languages(self, preferred_languages):
model = self.get_model()
for row, lang in enumerate(ALL_LANGUAGES):
model.append([lang])
if lang in preferred_languages:
self.get_selection().select_iter(model.get_iter(row))
# collects only the selected languages in the treeview
# to save in the preferences database
def get_languages(self):
model, rows = self.get_selection().get_selected_rows()
result = [model.get_value(model.get_iter(row), 0) for row in rows]
return result
如果您有兴趣看到我的一两次尝试,我很乐意为您服务。
编辑:对于临时读者,请将任何出现的$ PROJECTNAME $替换为快速项目的实际名称(如中所指定quickly create
)。
HTH!