डिस्क्लेमर: मुझे आपके पोस्ट को पढ़ने तक या उस मामले के लिए सामान्य रूप से गिनी प्रोग्रामिंग के बारे में जल्दी से कुछ भी पता नहीं था । इसलिए मैं ईमानदारी से इस सवाल का जवाब देने की कोशिश में कोई व्यवसाय नहीं है :)
उस ने कहा, जल्दी से एक स्वच्छ परियोजना है। मैंने बॉयलरप्लेट स्रोत को संक्षेप में स्कैन किया और लिस्टस्टोर समर्थित सूची-शैली वरीयता को जोड़ने के लिए निम्नलिखित संभावित तरीकों की पहचान की:
- 'बंदर-पैच' प्राप्त करें और एक शेयर ट्री व्यू विजेट (w / ListStore मॉडल) पर widget_methods सेट करें जैसा कि डेटा / ui / वरीयताएँ $ PROJECTNAME $ Dialog.ui में ग्लेड के साथ परिभाषित किया गया है।
- लागू
set_widget_from_preference
और set_preference
PreferencesDialog की परियोजना के उपवर्ग में (उपवर्ग पसंद है $ ProjectName $ संवाद), और जब कुछ अलग करना key
या widget
अपने ListStore समर्थित है TreeView विजेट।
- ग्लेड के लिए मिलान कस्टम विजेट के साथ gtk.TreeView का एक कस्टम उपवर्ग लिखें ।
उनका परीक्षण करने के लिए, मैंने इन तीनों विचारों को लागू किया - प्रत्येक ने इरादा के रूप में काम किया, और AFAICT, पहचान के रूप में। अंत में, तीसरा (विशेष रूप से) मुझे सबसे साफ लग रहा था, और बॉयलरप्लेट भर में उपयोग किए जाने वाले सम्मेलनों के करीब, शुरुआत में विपरीत की उम्मीद करने के बावजूद।
यहाँ मैं तीन नंबर के लिए चरणों का पालन कर रहा हूँ ...
इस ट्यूटोरियल (भाग 2) के माध्यम से quickly design
(जल्दी से 11.10, btw), और शिथिलता से ग्लेड का उपयोग करते हुए , प्राथमिकताएँ $ PROJECTNAME $ Dialog.ui में एक स्क्रॉल किए गए विजेट को जोड़ें, उस पर एक ट्री व्यू ड्रॉप करें, ट्री व्यू नाम दें । ट्री व्यू के लिए एक नया ListStore मॉडल बनाएं जब संकेत दिया जाए, और इसे language_liststore, आदि का नाम दें ... आखिरकार मैंने कुछ इस के साथ समाप्त किया:language_treeview
इसके बाद, नीचे दी गई सामग्री के साथ एक ग्लेड कैटलॉग (डेटा / ui / वरीयताओं_ $ 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 -->
... शीर्ष पर, आवश्यकता टैग के तहत। और बाद में एक कदम के लिए तैयारी में, भाषा $ प्राथमिकताएं $ PROJECTNAME $ के लिए Language_treeview का वर्ग गुण बदलें।
अंत में, वरीयता $ PROJECTNAME $ Dialog.py में निम्नलिखित तत्व को widget_methods सूची में जोड़ें
'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!