以 ListStore 为首选,快速应用

以 ListStore 为首选,快速应用

我开始用“快速”编写程序。所需语言列表将是一个首选项。示例:

languages = ["en", "de"]

处理偏好部分的(自动创建的)快速代码如下所示:

# 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'],
}

在 GUI 中,gtk 中列表的首选窗口小部件似乎是 ListStore(它不是窗口小部件,而是模型,但它在 Glade 文件中定义...)。有人能告诉我上面代码中的 和 的 ListStore 有什么'getter''setter''changed'

对于简单的输入小部件等来说,这种方法看起来很简单,但我不知道如何在列表中使用它。

或者,我当然会接受任何其他方式将列表作为偏好处理,只要列表的长度不是固定的。

答案1

免责声明:我对此一无所知迅速地直到我读了你的帖子,或者关于 GUI 编程的一般内容。因此,老实说,我没资格回答这个问题 :)

话虽如此,迅速地是一个很棒的项目。我简单浏览了一下样板源代码,确定了以下添加 ListStore 支持的列表样式偏好设置的潜在方法:

  1. 'Monkey-patch' 获取并将 widget_methods 设置到一个库存 TreeView 小部件(带有 ListStore 模型)上,如在 data/ui/Preferences$PROJECTNAME$Dialog.ui 中使用 glade 所定义。
  2. 在项目的 PreferencesDialog 子类中实现set_widget_from_preference和(子类是 Preferences$PROJECTNAME$Dialog),当或者是您的 ListStore 支持的 TreeView 小部件时,做一些不同的事情。set_preferencekeywidget
  3. 编写一个自定义的 gtk.TreeView 子类并匹配为 Glade 定制小部件

为了测试它们,我实施了所有这三个想法——每个想法都按预期工作,而且 AFAICT 完全相同。最后,第三个(特别是)对我来说似乎是最干净的,并且更接近整个样板中使用的惯例,尽管最初预期相反。


以下是我针对第三个步骤所遵循的步骤...

使用 glade via quickly design(顺便说一下,很快是 11.10),并松散地遵循本教程(第 2 部分),将 ScrolledWindow 小部件添加到 Preferences$PROJECTNAME$Dialog.ui,将 TreeView 拖放到其上,将 TreeView 命名为language_treeview。出现提示时为 TreeView 创建一个新 ListStore 模型,并将其命名为 language_liststore,等等……最终我得到了类似这样的结果:

林间空地

接下来,添加一个 glade 目录 (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 -->

... 到顶部,在requires标签下。并将language_treeview的class属性更改为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

如果您有兴趣看看我对一和二的尝试,我很乐意效劳。

编辑:对于普通读者来说,替换任何出现的项目名称$用你的真实姓名迅速地项目(如中所述quickly create)。

呼呼!

答案2

我自己还没有尝试过“快速”,但根据我的 GTK 经验,我会使用单选按钮处理语言选择。

观察toggled事件和button.get_active()方法就足以检查用户选择了什么。

相关内容