แอปพลิเคชันอย่างรวดเร็วพร้อม 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'],
}

ใน GUI ดูเหมือนว่าวิดเจ็ตที่เลือกใน gtk สำหรับรายการคือ ListStore (ซึ่งไม่ใช่วิดเจ็ต แต่เป็นแบบจำลอง แต่มันถูกกำหนดไว้ในไฟล์ Glade ... ) คนที่สามารถบอกสิ่งที่จะทำงานให้ ListStore สำหรับที่'getter', 'setter'และ'changed'ในโค้ดข้างต้นหรือไม่

วิธีนี้ดูง่ายสำหรับวิดเจ็ตการป้อนข้อมูลอย่างง่ายและเช่นนั้น แต่ฉันไม่รู้วิธีใช้กับรายการ

อีกทางหนึ่งฉันจะยอมรับวิธีอื่นในการจัดการกับรายการเป็นค่ากำหนดหากความยาวของรายการไม่คงที่


ไม่ใช่คำตอบสำหรับคำถาม แต่ทำไมแอปของคุณต้องเปลี่ยนภาษา มันไม่เพียงแค่ใช้ gettext และสถานที่ที่ผู้ใช้กำหนดเพื่อกำหนดภาษาหรือไม่ นั่นเป็นวิธีมาตรฐานในการจัดการกับการแปลแอปพลิเคชัน: มันจะทำงานโดยอัตโนมัติและจะทำงานให้คุณได้น้อยกว่ามาก
David Planella

@DavidPlnella: เป็นคำถามที่ดี มันไม่ได้เปลี่ยนภาษา แอพพลิเคชั่นนี้จะค้นหารายการทีวีในฐานข้อมูล เนื่องจากหลายคนพูดมากกว่าหนึ่งภาษาจึงสามารถเรียกคืนตอนต่างๆได้ทั้งหมด ตัวอย่าง: ฉันดูรายการโทรทัศน์ภาษาเยอรมันและภาษาอังกฤษ
xubuntix

คำตอบ:


2

คำเตือน: ฉันไม่รู้อะไรเกี่ยวกับอย่างรวดเร็วจนกว่าฉันจะอ่านโพสต์ของคุณหรือเกี่ยวกับการเขียนโปรแกรม Gui โดยทั่วไปสำหรับเรื่องนั้น ดังนั้นฉันจึงไม่มีธุรกิจที่พยายามตอบคำถามนี้ :)

ที่กล่าวว่าอย่างรวดเร็วเป็นโครงการที่เรียบร้อย ฉันสแกนแหล่งข้อมูลสำเร็จรูปในเวลาสั้น ๆ และระบุแนวทางที่เป็นไปได้ดังต่อไปนี้สำหรับการเพิ่มการตั้งค่าสไตล์ลิสต์ ListStore ที่ได้รับการสนับสนุน:

  1. 'Monkey-patch' รับและตั้งค่า widget_methods บนวิดเจ็ต TreeView หุ้น (โมเดล w / ListStore) ตามที่กำหนดไว้ใน data / ui / Preferences $ PROJECTNAME $ Dialog.ui พร้อม glade
  2. ดำเนินการset_widget_from_preferenceและset_preferenceใน subclass โครงการของ PreferencesDialog (subclass คือการตั้งค่า $ ProjectName $ Dialog) และทำสิ่งที่แตกต่างกันเมื่อkeyหรือwidgetเป็น ListStore ของคุณได้รับการสนับสนุน TreeView วิดเจ็ต
  3. เขียนเป็น subclass กำหนดเองของ gtk.TreeView กับการจับคู่ที่กำหนดเองเครื่องมือสำหรับบึง

ในการทดสอบพวกเขาฉันได้นำความคิดทั้งสามนี้ไปปฏิบัติตามที่ตั้งใจและ AFAICT เหมือนกัน ในท้ายที่สุดคนที่สาม (โดยเฉพาะ) ดูเหมือนจะสะอาดที่สุดสำหรับฉันและใกล้กับอนุสัญญาที่ใช้ทั่วหม้อไอน้ำแม้ว่าในตอนแรกคาดหวังสิ่งตรงกันข้าม


นี่คือขั้นตอนที่ฉันติดตามสำหรับหมายเลขสาม ...

การใช้บึงผ่านquickly design(อย่างรวดเร็ว 11.10, BTW) และหลวม ๆ ดังต่อไปนี้การกวดวิชานี้ (ตอน 2)เพิ่ม ScrolledWindow เครื่องมือที่จะตั้งค่า $ ProjectName $ Dialog.ui วาง TreeView บนมันชื่อ language_treeviewTreeView สร้างรูปแบบ ListStore ใหม่สำหรับ TreeView เมื่อได้รับแจ้งและตั้งชื่อเป็น language_liststore และอื่น ๆ ... ในที่สุดฉันก็จบลงด้วยสิ่งนี้:

บึง-คุณสมบัติ

ถัดไปเพิ่มแคตตาล็อก Glade (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 -->

... ไปด้านบนภายใต้แท็กต้องการ และเปลี่ยนแอตทริบิวต์ class ของ language_treeview เป็น Preferences $ PROJECTNAME $ TreeView เพื่อเตรียมพร้อมสำหรับขั้นตอนต่อไป

สุดท้ายให้เพิ่มองค์ประกอบต่อไปนี้ในรายการ widget_methods ใน Preferences $ 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 ของฉันฉันจะใช้ปุ่มตัวเลือกเพื่อจัดการการเลือกภาษา

การดูtoggledเหตุการณ์พร้อมกับbutton.get_active()วิธีการนั้นน่าจะเพียงพอที่จะตรวจสอบสิ่งที่ผู้ใช้เลือก


ทำตามคำแนะนำของคุณฉันมองดูปุ่มตัวเลือกอีกครั้ง แต่มันก็ไม่เหมาะ: เนื่องจากรายการของภาษาที่เป็นไปได้อีกต่อไปแล้วจะได้รับอย่างมากจากปุ่มตัวเลือกทางเลือกเดียวเท่านั้นที่จะมีเครื่องมือแยกต่างหาก และ radiobuttons ทั้งหมดจะทำงานอยู่เสมอ มันดูไม่ค่อยดีเท่าไหร่
xubuntix

ตรวจสอบให้แน่ใจว่าคุณใช้กลุ่มวิทยุอย่างถูกต้อง นอกจากนี้toggledเหตุการณ์ยังสามารถใช้งานได้ทั้งสำหรับปุ่มที่เลือกและไม่ได้เลือกนั่นคือสาเหตุที่ควรจะเพียงพอ
Alexandre

สิ่งที่ฉันหมายถึงคือการมีปุ่มตัวเลือก 200 ปุ่มไม่ใช่ส่วนต่อประสานผู้ใช้ที่ดี สิ่งที่ฉันต้องการคือวิธีเก็บรายการที่สามารถเพิ่มและลบรายการได้ตามต้องการ
xubuntix
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.