Feragatname: Postanızı okuyana kadar hızlı bir şekilde veya bu konuda genel olarak gui programlama hakkında hiçbir şey bilmiyordum . Bu nedenle dürüstçe bu soruyu cevaplamaya çalışan hiçbir işim yok :)
Bununla birlikte, hızlı bir şekilde düzgün bir proje. Ortak kaynak kaynağını kısaca taradım ve bir ListStore destekli liste stili tercihi eklemek için aşağıdaki potansiyel yaklaşımları belirledim:
- 'Maymun yaması' widget_methods'u glade ile data / ui / Preferences $ PROJECTNAME $ Dialog.ui'de tanımlandığı gibi bir stok TreeView widget'ına (ListStore modeli ile) getirin ve ayarlayın.
- Uygulamak
set_widget_from_preference
ve set_preference
PreferencesDialog projenin alt sınıfta (alt sınıf Tercihleri olduğunu $ ProjeAdı $ Diyalog) ve zaman farklı bir şey yapmak key
ya widget
da ListStore TreeView Widget desteklenmektedir.
- Glade için eşleşen özel bir widget ile özel bir gtk.TreeView alt sınıfı yazın .
Onları test etmek için, bu fikirlerin üçünü de uyguladım - her biri amaçlandığı gibi ve AFAICT aynı şekilde çalıştı. Sonunda, üçüncüsü (özellikle) başlangıçta tam tersini beklemesine rağmen, kazan plakası boyunca kullanılan sözleşmelere en temiz ve daha yakın görünüyordu.
İşte üç numara için izlediğim adımlar ...
Glade kullanarak quickly design
(hızlı bir şekilde 11.10, btw) ve bu öğreticiyi (bölüm 2) gevşek bir şekilde takip ederek, Tercihler $ PROJECTNAME $ Dialog.ui'ye bir ScrolledWindow widget'ı ekleyin, üzerine bir TreeView bırakın, TreeView olarak adlandırın language_treeview
. İstendiğinde TreeView için yeni bir ListStore modeli oluşturun ve bunu language_liststore, vb olarak adlandırın ... sonunda böyle bir şeyle sonuçlandım:
Ardından, aşağıdaki içeriğe sahip bir glade kataloğu (data / ui / preferences_ $ PROJECTNAME $ _treeview.xml) ekleyin:
<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>
Ardından, Tercihler $ PROJECTNAME $ Dialog.ui'yi düzenleyerek şunu ekleyin:
<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->
... üstte, zorunlu etiketi altında. Ve sonraki bir adıma hazırlanmak için language_treeview sınıf özniteliğini Tercihler $ PROJECTNAME $ TreeView olarak değiştirin.
Son olarak, Tercihler $ PROJECTNAME $ Dialog.py içindeki widget_methods listesine aşağıdaki öğeyi ekleyin
'language_treeview': ['get_languages', 'set_languages', 'button-release-event']
Aynı dosyanın sonunda (Tercihler $ PROJECTNAME $ Dialog.py) ekleyin,
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
Bir ya da iki kişilik teşebbüslerimi görmekle ilgileniyorsanız, bunu yapmaktan memnuniyet duyarım.
Düzenleme: Sıradan okuyucu için, $ PROJECTNAME $ oluşumunu hızlı projenizin gerçek adıyla değiştirin (belirtildiği gibi quickly create
).
HTH!