Быстрое приложение с ListStore в качестве предпочтения

Быстрое приложение с ListStore в качестве предпочтения

Я начинаю писать программу с 'quickly'. Список желаемых языков будет одним из предпочтений. Пример:

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'в коде выше?

Подход выглядит простым для простых виджетов ввода и т. п., но я не знаю, как использовать его со списками.

В качестве альтернативы я, конечно, принял бы любой другой способ работы со списками предпочтений, при условии, что длина списка не фиксирована.

решение1

Отказ от ответственности: Я ничего не знал обыстропока я не прочитал ваш пост, или о программировании gui в целом, если на то пошло. Поэтому, честно говоря, у меня нет дела, чтобы пытаться ответить на этот вопрос :)

Тем не менее,быстро— аккуратный проект. Я быстро просмотрел исходный код шаблона и выявил следующие потенциальные подходы для добавления предпочтения в стиле списка, поддерживаемого ListStore:

  1. «Monkey-patch» получает и устанавливает widget_methods для стандартного виджета TreeView (с моделью ListStore), как определено в data/ui/Preferences$PROJECTNAME$Dialog.ui с помощью glade.
  2. Реализуйте set_widget_from_preferenceи set_preferenceв подклассе проекта PreferencesDialog (подкласс — Preferences$PROJECTNAME$Dialog) и сделайте что-нибудь другое, когда keyили widget— это поддерживаемый ListStore виджет TreeView.
  3. Напишите пользовательский подкласс gtk.TreeView с соответствующимпользовательский виджет для glade.

Чтобы проверить их, я реализовал все три идеи — каждая из них работала так, как и предполагалось, и AFAICT, идентично. В конце концов, третья (в частности) показалась мне самой чистой и более близкой к соглашениям, используемым в шаблоне, хотя изначально я ожидал противоположного.


Вот шаги, которые я выполнил для пункта три...

Используя glade via quickly design(быстро 11.10, кстати), и примерно следуяэтот урок (часть 2), добавьте виджет ScrolledWindow в Preferences$PROJECTNAME$Dialog.ui, поместите на него TreeView, назовите TreeView language_treeview. Создайте новую модель ListStore для TreeView при появлении запроса и назовите ее 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. И измените атрибут class language_treeview на Preferences$PROJECTNAME$TreeView, готовясь к следующему шагу.

Наконец, добавьте следующий элемент в список widget_methods в Preferences$PROJECTNAME$Dialog.py

'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

Если вам интересно увидеть мои попытки сделать первый и второй, я с радостью это сделаю.

Редактировать:Для случайного читателя замените все вхождения$PROJECTNAME$с фактическим именем вашегобыстропроект (как указано в quickly create).

ХТН!

решение2

Я сам не пробовал «быстро», но с моим опытом работы с GTK я бы использовалРадио-кнопкидля управления выбором языка.

Наблюдения за toggledсобытием вместе с button.get_active()методом должно быть достаточно, чтобы проверить, что именно выбрал пользователь.

Связанный контент