我開始用「快速」寫一個程式。所需語言的清單將是一個偏好。例子:
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 支援的清單樣式首選項的潛在方法:
- 'Monkey-patch' 取得並設定 widget_methods 到庫存 TreeView 小部件(帶有 ListStore 模型),如 data/ui/Preferences$PROJECTNAME$Dialog.ui 中定義,帶有空地。
- 在專案的 PreferencesDialog 子類別(子類別是 Preferences$PROJECTNAME$Dialog)中實作
set_widget_from_preference
和,並在 ListStore 支援的 TreeView 小工具時執行不同的操作。set_preference
key
widget
- 編寫 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()
方法應該足以檢查使用者選擇的內容。