Я начинаю писать программу с «быстро». Список желаемых языков будет одним из предпочтений. Пример:
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'
в коде выше?
Подход выглядит простым для простых виджетов ввода и тому подобного, но я не знаю, как использовать его со списками.
В качестве альтернативы, я бы, конечно, принял любой другой способ работы со списками в качестве предпочтений, при условии, что длина списка не фиксирована.
Отказ от ответственности: Я ничего не знал о быстро, пока я не читал Ваше сообщение, или о gui, программирующем в целом в этом отношении. Поэтому у меня честно нет бизнеса, пытающегося отвечать на этот вопрос :)
Тем не менее быстро аккуратный проект. Я просканировал шаблонный источник кратко и определил следующие потенциальные подходы для добавления, что ListStore поддержал предпочтение стиля списка:
set_widget_from_preference
и set_preference
в подклассе проекта PreferencesDialog (подкласс является Preferences$PROJECTNAME$Dialog), и делают что-то другое когда key
или widget
поддержанный виджет TreeView Вашего ListStore.Для проверения их я реализовал все три из этих идей - каждый работал, как предназначено, и AFAICT, тождественно. В конце третье (в особенности) казалось самым чистым мне, и ближе конвенциям, используемым всюду по шаблону, несмотря на начальное ожидание противоположного.
Вот шаги, которые я выполнил для номера три...
Используя поляну через 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 -->
... к вершине, под требует тега. И измените атрибут класса 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
).
HTH!
Я сам не пробовал «быстро», но с моим опытом работы с GTK я бы использовал радио-кнопки для выбора языка.
Наблюдения за событием toggled
вместе с методом button.get_active()
должно быть достаточно, чтобы проверить, что выбрал пользователь.