免責事項:あなたの投稿を読むまで、私はすぐには何も知りませんでした。あるいは、その問題については、一般的なGUIプログラミングについては何も知りませんでした。したがって、正直に言って、この質問に答えようとするビジネスはありません:)
そうは言っても、すぐにきちんとしたプロジェクトです。ボイラープレートのソースを簡単にスキャンし、ListStoreを利用したリストスタイルの設定を追加するための次の潜在的なアプローチを特定しました。
- 'Monkey-patch'は、data / ui / Preferences $ PROJECTNAME $ Dialog.uiでグラードを使用して定義されているストックTreeViewウィジェット(w / ListStoreモデル)にwidget_methodsを取得および設定します。
- 実装
set_widget_from_preference
とset_preference
PreferencesDialogのプロジェクトのサブクラスで(サブクラスが設定$ PROJECTNAME $ダイアログで)、そして別の何かやるkey
か、widget
あなたのListStoreは、ツリービューウィジェットをバックアップされています。
- gladeに対応するカスタムウィジェットを使用して、gtk.TreeViewのカスタムサブクラスを記述します。
それらをテストするために、私はこれらの3つのアイデアをすべて実装しました。それぞれが意図したとおりに機能し、AFAICTも同じように機能しました。結局、3番目の(特に)は私には最もクリーンに見え、最初は反対を期待していたにも関わらず、ボイラープレート全体で使用されている規則に近いように見えました。
ここに私が3番目に行ったステップがあります...
Glade via quickly design
(すばやい11.10、btw)を使用し、このチュートリアル(パート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 -->
...ページ上部のrequireタグの下に。そして、後のステップに備えて、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
私の1つと2つの試みをご覧になりたい場合は、喜んでお伝えします。
編集:カジュアルリーダーの場合は、$ PROJECTNAME $の出現箇所を、迅速に作成したプロジェクトの実際の名前に置き換えます(で指定quickly create
)。
HTH!