web-dev-qa-db-ja.com

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ファイルで定義されている...)のように見えます。誰かが私にthe'getter''setter'および'changed'上記のコードでは?

このアプローチは、単純な入力ウィジェットなどでは簡単に見えますが、リストで使用する方法がわかりません。

あるいは、リストの長さが固定されていない限り、リストを設定として扱う他の方法ももちろん受け入れます。

10
xubuntix

免責事項:私はあなたの投稿を読むまで(= /// =)について何も知らなかった。したがって、私は正直にこの質問に答えようとするビジネスを持っていません:)

とはいえ、quicklyはきちんとしたプロジェクトです。ボイラープレートのソースを簡単にスキャンし、ListStoreでバックアップされたリストスタイルの設定を追加するための次の潜在的なアプローチを特定しました。

  1. 'Monkey-patch'は、data/ui/Preferences $ PROJECTNAME $ Dialog.uiで定義されているように、gladeを使用してwidget_methodsを取得し、ストックTreeViewウィジェット(ListStoreモデル付き)に設定します。
  2. PreferencesDialogのプロジェクトのサブクラスにset_widget_from_preferenceおよびset_preferenceを実装し(サブクラスはPreferences $ PROJECTNAME $ Dialogです)、keyまたはwidgetがListStoreの場合に異なることを行いますバックアップされたTreeViewウィジェット。
  3. 一致する gladeのカスタムウィジェット でgtk.TreeViewのカスタムサブクラスを記述します。

それらをテストするために、これら3つのアイデアをすべて実装しました。それぞれが意図したとおりに機能し、AFAICTも同様に機能しました。結局、3番目(特に)が最もきれいに見え、最初は反対のことを期待していましたが、定型句全体で使用されている規則に近くなりました。


ここに私が3番目に行った手順があります...

quickly design(11.10、btw)を介してgladeを使用し、大まかに このチュートリアル(パート2) に従って、Preferences $ PROJECTNAME $ Dialog.uiにScrolledWindowウィジェットを追加し、TreeViewをドロップしますそれ、TreeViewにlanguage_treeviewという名前を付けます。プロンプトが表示されたらTreeViewの新しいListStoreモデルを作成し、language_liststoreなどと名前を付けます...最終的には次のようなものになりました。

glade-properties

次に、次の内容の空き地カタログ(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_= "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つの試みを見てみたいと思うなら、喜んで喜んでいます。

Edit:カジュアルな読者のために、$ PROJECTNAME $の出現箇所を実際の名前に置き換えますquicklyプロジェクト(quickly createで指定)。

HTH!

2
mwalsh

私は自分で「すばやく」試したことはありませんが、GTKの経験があれば、言語選択を処理するために Radio Buttons を使用します。

toggledイベントとbutton.get_active()メソッドを一緒に見るだけで、ユーザーが何を選択したかを確認できます。

0
Alexandre