xub*_*tix 10 python gtk quickly application-development
我开始用“快速”编写程序。所需语言的列表将是一个首选。例子:
languages = ["en", "de"]
Run Code Online (Sandbox Code Playgroud)
处理首选项部分的(自动创建的)快速代码如下所示:
# Define your preferences dictionary in the __init__.main() function.
# The widget names in the PreferencesTestProjectDialog.ui
# file need to correspond to the keys in the preferences dictionary.
#
# Each preference also need to be defined in the 'widget_methods' map below
# to show up in the dialog itself. Provide three bits of information:
# 1) The first entry is the method on the widget that grabs a value from the
# widget.
# 2) The second entry is the method on the widget that sets the widgets value
# from a stored preference.
# 3) The third entry is a signal the widget will send when the contents have
# been changed by the user. The preferences dictionary is always up to
# date and will signal the rest of the application about these changes.
# The values will be saved to desktopcouch when the application closes.
#
# TODO: replace widget_methods with your own values
widget_methods = {
'languages': ['getter', 'setter', 'changed'],
}
Run Code Online (Sandbox Code Playgroud)
在 GUI 中,似乎在 gtk 中为列表选择的小部件是一个 ListStore(它不是小部件,而是一个模型,但它是在 Glade 文件中定义的...)。有人能告诉我什么适用于 ListStore 的'getter'
,'setter'
以及'changed'
上面的代码吗?
对于简单的条目小部件等,该方法看起来很容易,但我不知道如何将它与列表一起使用。
或者,我当然会接受任何其他方式来处理列表作为首选项,前提是列表的长度不固定。
免责声明:在阅读您的文章之前,我对快速或一般的 gui 编程一无所知。因此,老实说我没有权利尝试回答这个问题:)
也就是说,快速是一个很好的项目。我简要浏览了样板源代码,并确定了以下添加 ListStore 支持的列表样式首选项的潜在方法:
set_widget_from_preference
和,并在ListStore 支持的 TreeView 小部件时执行不同的操作。set_preference
key
widget
为了测试它们,我实现了所有这三个想法——每个想法都按预期工作,并且 AFAICT 完全相同。最后,第三个(尤其是)对我来说似乎是最干净的,并且更接近整个样板中使用的约定,尽管最初期望相反。
这是我第三步遵循的步骤......
使用glade via quickly design
(快速11.10,顺便说一句),并大致遵循本教程(第2部分),将ScrolledWindow小部件添加到Preferences$PROJECTNAME$Dialog.ui,将TreeView拖放到其上,将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>
Run Code Online (Sandbox Code Playgroud)
然后,编辑 Preferences$PROJECTNAME$Dialog.ui,添加...
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
Run Code Online (Sandbox Code Playgroud)
...到顶部,在需要标签下。并将 language_treeview 的 class 属性更改为 Preferences$PROJECTNAME$TreeView,为后面的步骤做准备。
最后,将以下元素添加到 Preferences$PROJECTNAME$Dialog.py 中的 widget_methods 列表中
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Run Code Online (Sandbox Code Playgroud)
并在同一文件 (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
Run Code Online (Sandbox Code Playgroud)
如果您有兴趣看看我对一和二的尝试,我很乐意效劳。
编辑:对于临时读者,请将出现的任何$PROJECTNAME$替换为您的快速项目的实际名称(如 中指定的quickly create
)。
哈!
归档时间: |
|
查看次数: |
749 次 |
最近记录: |