ListStoreを優先して素早く適用

ListStoreを優先して素早く適用

私は「すぐに」プログラムを書き始めています。希望する言語のリストは、1 つの好みになります。例:

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'およびの ListStore に何が機能するかを教えていただけますか?'setter''changed'

このアプローチは、単純なエントリ ウィジェットなどでは簡単に見えますが、リストではどのように使用すればよいかわかりません。

あるいは、リストの長さが固定されていない限り、リストを処理する他の方法を好みとして受け入れることももちろん可能です。

答え1

免責事項:私は何も知りませんでした素早くあなたの投稿を読むまでは、あるいは GUI プログラミング全般について知るまでは。ですから、正直言って、この質問に答える資格はありません :)

そうは言っても、素早くすばらしいプロジェクトです。定型ソースを簡単にスキャンしたところ、ListStore でサポートされるリスト スタイルの設定を追加するための次のアプローチが考えられました。

  1. 'Monkey-patch' は、glade を使用して、data/ui/Preferences$PROJECTNAME$Dialog.ui で定義されている標準の TreeView ウィジェット (ListStore モデル付き) に widget_methods を取得および設定します。
  2. プロジェクトのPreferencesDialogのサブクラス(サブクラスはPreferences$PROJECTNAME$Dialog)でset_widget_from_preferenceと を実装し、 またはがListStoreでサポートされているTreeViewウィジェットである場合に異なる処理を実行します。set_preferencekeywidget
  3. 対応するgtk.TreeViewのカスタムサブクラスを作成しますグレイドのカスタムウィジェット

これらをテストするために、私はこれら 3 つのアイデアをすべて実装しました。それぞれが意図したとおりに機能し、私の知る限りまったく同じでした。最終的には、最初は逆のことを予想していたにもかかわらず、特に 3 番目が最もわかりやすく、定型文全体で使用されている規則に近いように思えました。


3番目に私が実行した手順は次のとおりです...

グレイド経由quickly design(クイック11.10、ちなみに)を使用し、大まかにフォローこのチュートリアル(パート2)、ScrolledWindow ウィジェットを Settings$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 -->

... を一番上の requires タグの下に移動します。また、後の手順に備えて、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

もし、私の 1 番目と 2 番目の試みに興味があれば、喜んでお応えします。

編集:一般読者向けに、$プロジェクト名$あなたの実際の名前で素早くプロジェクト( に指定quickly create)。

ありがとう!

答え2

私自身は「すぐに」試したことはないが、GTKの経験から、ラジオボタン言語選択を処理します。

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

関連情報