ListStoreを設定としてすばやく適用


10

「すばやい」でプログラムを書き始めています。希望する言語のリストが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ファイルで定義されています...)のように見えます。誰かが何をのためのListStoreために働くだろう私に伝えることができ'getter''setter'そして'changed'上記のコードでは?

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

あるいは、もちろん、リストの長さが固定されていなければ、他の方法でリストを処理することもできます。


質問に対する回答ではありませんが、アプリで言語を切り替える必要があるのはなぜですか?言語を決定するために単にgettextとユーザーが定義したロケールを使用することはできませんか?これは、アプリケーションの翻訳を処理する標準的な方法です。これは自動的に機能し、ユーザーの作業ははるかに少なくなります。
David Planella、2011年

@DavidPlnella:良い質問です。言語を切り替えません。アプリはデータベースでTVエピソードを検索します。多くの人が複数の言語を話すため、それらすべてのエピソードを取得できます。例:ドイツ語と英語のテレビエピソードを視聴しています。
xubuntix

回答:


2

免責事項:あなたの投稿を読むまで、私はすぐには何も知りませんでした。あるいは、その問題については、一般的なGUIプログラミングについて何も知りませんでした。したがって、正直に言って、この質問に答えようとするビジネスはありません:)

そうは言っても、すぐにきちんとしたプロジェクトです。ボイラープレートのソースを簡単にスキャンし、ListStoreを利用したリストスタイルの設定を追加するための次の潜在的なアプローチを特定しました。

  1. 'Monkey-patch'は、data / ui / Preferences $ PROJECTNAME $ Dialog.uiでグラードを使用して定義されているストックTreeViewウィジェット(w / ListStoreモデル)にwidget_methodsを取得および設定します。
  2. 実装set_widget_from_preferenceset_preferencePreferencesDialogのプロジェクトのサブクラスで(サブクラスが設定$ PROJECTNAME $ダイアログで)、そして別の何かやるkeyか、widgetあなたのListStoreは、ツリービューウィジェットをバックアップされています。
  3. 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-properties

次に、次の内容の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!


これは非常にうまく機能し、非常に明確に見えるので、他の2つの試行は必要ありませんが、もう一度お試しいただきありがとうございます...回答は非常に長くても明確であるため、ここで完全なチュートリアルに拡張することをお勧めします。developer.ubuntu.com/resources/tutorials/allとにかく:ありがとうございます!
xubuntix

@xubuntixそれは興味深いアイデアです。詳しく調べます。リンクと担当者に感謝します!
mwalsh、2011年

0

私は自分で「素早く」試したことはありませんが、GTKの経験では、ラジオボタンを使用して言語の選択を処理していました。

メソッドtoggledとともにイベントを監視するbutton.get_active()だけで、ユーザーが選択した内容を確認できます。


あなたの提案に従って、私はラジオボタンをもう一度見ましたが、それは理想的ではないようです:可能な言語のリストはラジオボタンによってうまく提供できるよりもはるかに長いので、唯一の選択肢は、追加のラジオボタンを追加する別個のウィジェットを持つことです、すべてのラジオボタンは常にアクティブです。それはそれほど良くないようです。
xubuntix

無線グループを適切に使用していることを確認してください。また、toggledイベントは選択されたボタンと選択されていないボタンの両方に使用できるため、これで十分です。
アレクサンドル

私が意味したことは、200個のラジオボタンを持つことは、優れたユーザーインターフェイスではありません。必要に応じてアイテムを追加および削除できるリストを保存する方法が必要です。
xubuntix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.