प्राथमिकता के रूप में लिस्टस्टोर के साथ जल्दी से आवेदन करें


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'],
}

GUI में, ऐसा लगता है जैसे किसी सूची के लिए gtk में पसंद का विजेट एक ListStore है (जो एक विजेट नहीं है, लेकिन एक मॉडल है, लेकिन यह ग्लेड फ़ाइल में परिभाषित है ...)। क्या कोई मुझे बता सकता है कि लिस्टस्टोर के लिए क्या काम करेगा 'getter', 'setter'और 'changed'ऊपर दिए गए कोड में?

सरल प्रविष्टि विगेट्स और इस तरह के लिए दृष्टिकोण आसान लगता है, लेकिन मुझे नहीं पता कि इसे सूचियों के साथ कैसे उपयोग किया जाए।

वैकल्पिक रूप से, मैं निश्चित रूप से सूचियों को प्राथमिकता के रूप में निपटने के लिए किसी अन्य तरीके को स्वीकार करूंगा, बशर्ते कि सूची की लंबाई तय नहीं है।


सवाल का जवाब नहीं, लेकिन आपके ऐप को भाषाओं को स्विच करने की आवश्यकता क्यों है? क्या यह भाषा निर्धारित करने के लिए बस गेटटेक्स्ट और उपयोगकर्ता के परिभाषित स्थान का उपयोग नहीं कर सकता है? किसी एप्लिकेशन के अनुवाद से निपटने का यह मानक तरीका है: यह स्वचालित रूप से काम करेगा और आपके लिए बहुत कम काम होगा।
डेविड प्लेनेला

@DavidPlnella: एक अच्छा सवाल। यह भाषाओं को स्विच नहीं करता है। ऐप एक डेटाबेस में टीवी एपिसोड देखता है। चूंकि बहुत से लोग अधिक बोलते हैं, फिर एक भाषा, उन सभी में एपिसोड को पुनः प्राप्त किया जा सकता है। उदाहरण: मैं जर्मन और अंग्रेजी टीवी एपिसोड देखता हूं।
xubuntix

जवाबों:


2

डिस्क्लेमर: मुझे आपके पोस्ट को पढ़ने तक या उस मामले के लिए सामान्य रूप से गिनी प्रोग्रामिंग के बारे में जल्दी से कुछ भी पता नहीं था । इसलिए मैं ईमानदारी से इस सवाल का जवाब देने की कोशिश में कोई व्यवसाय नहीं है :)

उस ने कहा, जल्दी से एक स्वच्छ परियोजना है। मैंने बॉयलरप्लेट स्रोत को संक्षेप में स्कैन किया और लिस्टस्टोर समर्थित सूची-शैली वरीयता को जोड़ने के लिए निम्नलिखित संभावित तरीकों की पहचान की:

  1. 'बंदर-पैच' प्राप्त करें और एक शेयर ट्री व्यू विजेट (w / ListStore मॉडल) पर widget_methods सेट करें जैसा कि डेटा / ui / वरीयताएँ $ PROJECTNAME $ Dialog.ui में ग्लेड के साथ परिभाषित किया गया है।
  2. लागू set_widget_from_preferenceऔर set_preferencePreferencesDialog की परियोजना के उपवर्ग में (उपवर्ग पसंद है $ ProjectName $ संवाद), और जब कुछ अलग करना keyया widgetअपने ListStore समर्थित है TreeView विजेट।
  3. ग्लेड के लिए मिलान कस्टम विजेट के साथ gtk.TreeView का एक कस्टम उपवर्ग लिखें ।

उनका परीक्षण करने के लिए, मैंने इन तीनों विचारों को लागू किया - प्रत्येक ने इरादा के रूप में काम किया, और AFAICT, पहचान के रूप में। अंत में, तीसरा (विशेष रूप से) मुझे सबसे साफ लग रहा था, और बॉयलरप्लेट भर में उपयोग किए जाने वाले सम्मेलनों के करीब, शुरुआत में विपरीत की उम्मीद करने के बावजूद।


यहाँ मैं तीन नंबर के लिए चरणों का पालन कर रहा हूँ ...

इस ट्यूटोरियल (भाग 2) के माध्यम से quickly design(जल्दी से 11.10, btw), और शिथिलता से ग्लेड का उपयोग करते हुए , प्राथमिकताएँ $ PROJECTNAME $ Dialog.ui में एक स्क्रॉल किए गए विजेट को जोड़ें, उस पर एक ट्री व्यू ड्रॉप करें, ट्री व्यू नाम दें । ट्री व्यू के लिए एक नया ListStore मॉडल बनाएं जब संकेत दिया जाए, और इसे language_liststore, आदि का नाम दें ... आखिरकार मैंने कुछ इस के साथ समाप्त किया:language_treeview

Glade-गुण

इसके बाद, नीचे दी गई सामग्री के साथ एक ग्लेड कैटलॉग (डेटा / 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!


यह बहुत अच्छी तरह से काम करता है और काफी स्पष्ट लगता है, इसलिए अन्य दो प्रयासों की आवश्यकता नहीं है, लेकिन उन्हें फिर से कोशिश करने के लिए धन्यवाद ... चूंकि आपका उत्तर बहुत लंबा है लेकिन फिर भी स्पष्ट है, आप इसे यहां एक संपूर्ण ट्यूटोरियल में विस्तारित करना चाह सकते हैं: developer.ubuntu.com/resources/tutorials/all वैसे भी: फिर से धन्यवाद!
xubuntix

@xubuntix यह एक दिलचस्प विचार है, मैं इसे देखूंगा। लिंक और प्रतिनिधि के लिए धन्यवाद!
mwalsh

0

मैंने खुद को 'जल्दी' आज़माने की कोशिश नहीं की है, लेकिन अपने जीटीके अनुभव के साथ मैं भाषा के चयन को संभालने के लिए रेडियो बटन का उपयोग करता हूं ।

देखना toggledके साथ साथ घटना button.get_active()विधि की जाँच करने के क्या उपयोगकर्ता का चयन किया है पर्याप्त होना चाहिए।


आपके सुझाव के बाद, मैंने फिर से रेडियो बटन्स को देखा, लेकिन यह आदर्श नहीं लगता: चूंकि संभावित भाषाओं की सूची बहुत लंबी है, इसलिए रेडियो बटन द्वारा अच्छी तरह से दिया जा सकता है, एकमात्र विकल्प एक अलग विजेट होगा जिसमें अतिरिक्त रेडियोबॉटन जोड़ा जाएगा, और सभी रेडियोबुटन हमेशा सक्रिय रहते हैं। इतना अच्छा नहीं लगता।
xubuntix

सुनिश्चित करें कि आप रेडियो समूहों का सही उपयोग कर रहे हैं। इसके अलावा, इस toggledघटना का उपयोग चयनित और अचयनित बटन दोनों के लिए किया जा सकता है, यही कारण है कि यह पर्याप्त होना चाहिए।
अलेक्जेंड्रे

मेरा मतलब है: 200 रेडियो बटन एक अच्छा उपयोगकर्ता इंटरफ़ेस नहीं है। मुझे एक सूची को संग्रहीत करने का एक तरीका है जहां वस्तुओं को जोड़ा जा सकता है और मांग पर हटाया जा सकता है।
xubuntix
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.