Швидке застосування за допомогою ListStore як перевагу


10

Я починаю писати програму з "швидко". Список бажаних мов буде одним із преференцій. Приклад:

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'в наведеному вище коді?

Підхід виглядає легко для простих віджетів для введення та таких, але я не знаю, як їх використовувати зі списками.

З іншого боку, я б, звичайно, прийняв будь-який інший спосіб розгляду списків як переваг, за умови, що довжина списку не визначена.


Не відповідь на питання, але чому вашому додатку потрібно перемикати мови? Чи не може він просто використовувати gettext та визначений користувачем локаль для визначення мови? Це стандартний спосіб роботи з перекладами програми: він працюватиме автоматично і буде набагато менше працювати для вас.
Девід Планелла

@DavidPlnella: гарне запитання. Він не перемикає мови. Додаток шукає телевізійні епізоди в базі даних. Оскільки багато людей розмовляють більше однією мовою, епізоди в усіх них можна отримати. Приклад: я переглядаю німецькі та англійські телевізійні епізоди.
xubuntix

Відповіді:


2

Відмова: Я швидко нічого не знав, поки не прочитав ваш пост, або про програмування gui взагалі з цього приводу. Тому я, чесно кажучи, не маю жодної справи, яка намагається відповісти на це питання :)

Це, швидше, є акуратним проектом. Я коротко просканував джерело котлової панелі та визначив наступні можливі підходи для додавання параметрів списку, підтримуваних списком ListStore:

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

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


Ось кроки, які я дотримувався для номера три ...

Використовуючи glade через quickly design(швидко 11.10, btw) і неміцно слідуючи цьому підручнику (частина 2) , додайте віджет ScrollWindow до налаштувань $ 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>

Потім відредагуйте Параметри $ PROJECTNAME $ Dialog.ui, додавши ...

<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->

... до початку, під тегом вимагає. І змініть атрибут класу language_treeview на Preferences $ PROJECTNAME $ TreeView, готуючись до наступного кроку.

Нарешті, додайте наступний елемент до списку widget_methods у налаштуваннях $ PROJECTNAME $ Dialog.py

'language_treeview': ['get_languages', 'set_languages', 'button-release-event']

І в кінці того самого файлу (Налаштування $ 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).

HTH!


Це працює дуже добре і здається цілком зрозумілим, тому інші дві спроби не потрібні, але ще раз дякую за те, що спробували їх ... Оскільки ваша відповідь дуже довга, але все одно зрозуміла, ви, можливо, захочете поширити її на повний підручник тут: developer.ubuntu.com/resources/tutorials/all У будь-якому разі: ще раз дякую!
xubuntix

@xubuntix Цікава ідея, я вивчу її. Дякуємо за посилання та представник!
mwalsh

0

Я ще не пробував "швидко", але, маючи досвід GTK, використовував би кнопки Radio для вибору мови.

Перегляд toggledподії разом із button.get_active()методом має бути достатньо, щоб перевірити, що обрав користувач.


Після вашої пропозиції я переглянув ще раз кнопки радіо, але це здається не ідеальним: оскільки список можливих мов набагато довший, то його можна було б чітко надати кнопками радіо, єдиною альтернативою було б мати окремий віджет, який додає додаткові радіо кнопки, і всі радіо кнопки завжди активні. Це здається не таким приємним.
xubuntix

Переконайтесь, що ви правильно використовуєте радіогрупи. Також toggledподію можна використовувати як для вибраних, так і невибраних кнопок, тому її має бути достатньо.
Олександр

Що я мав на увазі: наявність 200 радіо кнопок не є хорошим користувальницьким інтерфейсом. Що мені потрібно - це спосіб зберігати список, де елементи можна додавати та вилучати на вимогу.
xubuntix
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.