以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 檔案中定義的...)。有人可以告訴我上面程式碼中的'getter','setter'和的 ListStore 的工作原理是什麼嗎?'changed'

對於簡單的輸入小部件等來說,該方法看起來很簡單,但我不知道如何將其與列表一起使用。

或者,我當然會接受任何其他方式來處理清單作為偏好,前提是清單的長度不固定。

答案1

免責聲明:我對此一無所知迅速地直到我讀到你的文章,或是關於 GUI 程式的一般內容。因此,老實說我沒有權利嘗試回答這個問題:)

也就是說,迅速地是一個整潔的項目。我簡要瀏覽了樣板原始程式碼,並確定了以下新增 ListStore 支援的清單樣式首選項的潛在方法:

  1. 'Monkey-patch' 取得並設定 widget_methods 到庫存 TreeView 小部件(帶有 ListStore 模型),如 data/ui/Preferences$PROJECTNAME$Dialog.ui 中定義,帶有空地。
  2. 在專案的 PreferencesDialog 子類別(子類別是 Preferences$PROJECTNAME$Dialog)中實作set_widget_from_preference和,並在 ListStore 支援的 TreeView 小工具時執行不同的操作。set_preferencekeywidget
  3. 編寫 gtk.TreeView 的自訂子類別並匹配林間空地的自訂小部件

為了測試它們,我實現了所有這三個想法——每個想法都按預期工作,並且 AFAICT 完全相同。最後,第三個(尤其是)對我來說似乎是最乾淨的,並且更接近整個樣板中使用的約定,儘管最初期望相反。


這是我第三步遵循的步驟...

使用glade via quickly design(很快11.10,順便說一句),並鬆散地遵循本教程(第 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 -->

....到頂部,在需要標籤下。並將 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()方法應該足以檢查使用者選擇的內容。

相關內容