以ListStore为首选项快速应用


10

我开始用“快速”编写程序。所需语言列表将是其中的一种。例:

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文件中定义...)。谁能告诉我什么工作的为A ListStore 'getter''setter''changed'在上面的代码?

对于简单的输入小部件等而言,该方法看起来很容易,但是我不知道如何将其与列表一起使用。

另外,如果列表的长度不固定,我当然会接受其他任何方式来处理列表作为首选项。


这不是问题的答案,但是为什么您的应用程序需要切换语言?是否可以不简单地使用gettext和用户定义的语言环境来确定语言?这是处理应用程序翻译的标准方法:它将自动运行,而对您来说则要少得多。
戴维·普拉内拉

@DavidPlnella:一个好问题。它不会切换语言。该应用程序在数据库中查找电视剧集。由于许多人讲一种以上的语言,因此可以检索所有这些情节。示例:我看了德语和英语电视节目。
xubuntix 2011年

Answers:


2

免责声明:我不知道什么,直到我读您的文章,或对一般的GUI编程为这一问题。因此,老实说,我没有生意要回答这个问题:)

也就是说,迅速是一个整洁的项目。我简要地浏览了样板代码源,并确定了以下用于添加ListStore支持的列表样式首选项的潜在方法:

  1. 'monkey-patch'获取并设置widget_methods到一个普通的TreeView窗口小部件(带有ListStore模型),如在data / ui / Preferences $ PROJECTNAME $ Dialog.ui中定义的那样。
  2. 实现set_widget_from_preferenceset_preference在项目的PreferencesDialog的子类中(子类为Preferences $ PROJECTNAME $ Dialog),当key或是widgetListStore支持的TreeView小部件时,执行不同的操作。
  3. 使用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!


这非常有效,而且看起来很清晰,因此不需要其他两次尝试,但是再次感谢您尝试...由于您的回答很长但仍然很明确,您可能希望在此处将其扩展为完整的教程:developer.ubuntu.com/resources/tutorials/all无论如何:再次感谢!
xubuntix 2011年

@xubuntix这是一个有趣的想法,我会研究一下。感谢您的链接和代表!
mwalsh 2011年

0

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

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


按照您的建议,我再次查看了单选按钮,但这似乎并不理想:由于可能的语言列表要长得多,因此单选按钮可以很好地给出它,唯一的选择是使用单独的小部件来添加其他单选按钮,并且所有单选按钮始终处于活动状态。好像不太好。
xubuntix 2011年

确保正确使用无线电组。此外,该toggled事件可用于选定按钮和未选定按钮,因此它应该足够。
亚历山大

我的意思是:拥有200个单选按钮不是一个好的用户界面。我需要的是一种存储列表的方法,可以在其中按需添加和删除项目。
xubuntix 2011年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.