Быстрое приложение с 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'],
}

В графическом интерфейсе кажется, что виджетом выбора в gtk для списка есть ListStore (который не является виджетами, а моделью, но определен в файле Glade ...). Может ли кто-нибудь сказать мне, что будет работать для ListStore для 'getter', 'setter' и 'changed' в коде выше?

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

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

10
задан 14 October 2011 в 06:46

3 ответа

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

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

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

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

Вот шаги I Следуйте за номером три ...

Используя glade через quickly design (быстро 11.10, btw) и свободно следуя этому руководству (часть 2), добавьте виджет ScrolledWindow в Preferences $ PROJECTNAME $ Dialog.ui , отбросьте TreeView на него, назовите TreeView language_treeview. Создайте новую модель ListStore для TreeView при появлении запроса и назовите ее language_liststore и т. Д. ... в конце концов я закончил с чем-то вроде этого:

Затем добавьте каталог поляны ( 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

[ f3]

И в конце того же файла (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
ответ дан 25 May 2018 в 18:20
  • 1
    Это работает очень хорошо и кажется совершенно ясным, поэтому другие две попытки не нужны, но еще раз спасибо за их попытку ... Поскольку ваш ответ очень длинный, но все еще ясный, вы можете включить его в полный учебник здесь: developer.ubuntu.com/resources/tutorials/all В любом случае: еще раз спасибо! – xubuntix 20 October 2011 в 13:41
  • 2
    @xubuntix Это интересная идея, я рассмотрю ее. Спасибо за ссылку и репутацию! – mwalsh 20 October 2011 в 21:10

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

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

0
ответ дан 25 May 2018 в 18:20
  • 1
    Следуя вашему предложению, я снова посмотрел на Radio Buttons, но это кажется не идеальным: поскольку список возможных языков намного длиннее, тогда их можно легко использовать Radio Buttons, единственной альтернативой может быть отдельный виджет, который добавляет дополнительные радиообъективы, и все радиокнопки всегда активны. Это кажется не очень приятным. – xubuntix 17 October 2011 в 14:23
  • 2
    Убедитесь, что вы правильно используете радиостанции. Кроме того, событие toggled может использоваться как для выбранных, так и для невыделенных кнопок, поэтому этого должно быть достаточно. – Alexandre 18 October 2011 в 07:18
  • 3
    Я имел в виду следующее: наличие 200 переключателей не является хорошим пользовательским интерфейсом. Мне нужен способ хранения списка, в котором элементы могут быть добавлены и удалены по требованию. – xubuntix 18 October 2011 в 13:33

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

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

0
ответ дан 25 July 2018 в 21:13

Другие вопросы по тегам:

Похожие вопросы: