Aplikasi cepat dengan ListStore sebagai preferensi

10

Saya mulai menulis program dengan 'cepat'. Daftar bahasa yang diinginkan akan menjadi salah satu pilihan. Contoh:

languages = ["en", "de"]

Kode cepat (dibuat secara otomatis) yang menangani bagian preferensi terlihat seperti ini:

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

Dalam GUI, sepertinya widget pilihan di gtk untuk daftar adalah ListStore (yang bukan widget, tetapi model, tetapi ditentukan dalam file Glade ...). Dapatkah seseorang memberi tahu saya apa yang akan berfungsi untuk ListStore untuk 'getter', 'setter'dan 'changed'dalam kode di atas?

Pendekatannya terlihat mudah untuk widget entri sederhana dan semacamnya, tapi saya tidak tahu bagaimana menggunakannya dengan daftar.

Sebagai alternatif, saya tentu saja akan menerima cara lain untuk berurusan dengan daftar sebagai preferensi, asalkan panjang daftar tidak diperbaiki.

xubuntix
sumber
Bukan jawaban untuk pertanyaan itu, tetapi mengapa aplikasi Anda perlu beralih bahasa? Tidak bisakah hanya menggunakan gettext dan lokal yang ditentukan pengguna untuk menentukan bahasa? Itulah cara standar untuk menangani terjemahan suatu aplikasi: itu akan bekerja secara otomatis dan akan jauh lebih tidak berhasil untuk Anda.
David Planella
@ DavidvidPlnella: pertanyaan yang bagus. Itu tidak berganti bahasa. Aplikasi mencari episode TV dalam database. Karena banyak orang berbicara lebih dari satu bahasa, episode-episode di dalamnya semuanya dapat diambil. Contoh: Saya menonton episode TV Jerman dan Inggris.
xubuntix

Jawaban:

2

Penafian: Saya tidak tahu apa-apa tentang cepat sampai saya membaca posting Anda, atau tentang pemrograman gui secara umum dalam hal ini. Karena itu saya sejujurnya tidak punya usaha untuk menjawab pertanyaan ini :)

Konon, cepat adalah proyek yang rapi. Saya memindai sumber boilerplate secara singkat dan mengidentifikasi pendekatan potensial berikut untuk menambahkan preferensi gaya daftar yang didukung ListStore:

  1. 'Monkey-patch' dapatkan dan atur widget_methods ke widget TreeView stok (dengan model ListStore) sebagaimana didefinisikan dalam data / ui / Preferensi $ PROYEKNAME $ Dialog.ui dengan glade.
  2. Terapkan set_widget_from_preferencedan set_preferencedalam subkelas PreferensiDialog proyek (subkelasnya adalah Preferensi $ PROYEKTOR $ Dialog), dan lakukan sesuatu yang berbeda ketika keyatau widgetwidget TreeView yang didukung ListStore.
  3. Tulis subkelas kustom gtk.TreeView dengan widget khusus yang cocok untuk glade .

Untuk mengujinya, saya menerapkan ketiga gagasan ini - masing-masing berfungsi sebagaimana dimaksud, dan AFAICT, secara identik. Pada akhirnya, yang ketiga (khususnya) tampak paling bersih bagi saya, dan lebih dekat dengan konvensi yang digunakan di seluruh pelat, meskipun pada awalnya mengharapkan yang sebaliknya.


Berikut langkah-langkah yang saya ikuti untuk nomor tiga ...

Menggunakan glade via quickly design(cepat 11.10, btw), dan secara longgar mengikuti tutorial ini (bagian 2) , tambahkan widget ScrolledWindow ke Preferensi $ PROYEKNAME $ Dialog.ui, letakkan TreeView ke atasnya, beri nama TreeView language_treeview. Buat model ListStore baru untuk TreeView ketika diminta, dan beri nama language_liststore, dll ... akhirnya saya berakhir dengan sesuatu seperti ini:

sifat glade

Selanjutnya, tambahkan katalog glade (data / ui / preferensi_ $ PROJECTNAME $ _treeview.xml) dengan konten berikut:

<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>

Kemudian, edit Preferensi $ PROYEKNAMA $ Dialog.ui, menambahkan ...

<!-- interface-requires preferences_$PROJECTNAME$_treeview 1.0 -->

... ke atas, di bawah tag yang diperlukan. Dan ubah atribut kelas language_treeview ke Preferensi $ PROYEKNAME $ TreeView, sebagai persiapan untuk langkah selanjutnya.

Terakhir, tambahkan elemen berikut ke daftar widget_methods di Preferensi $ PROYEKNAME $ Dialog.py

'language_treeview': ['get_languages', 'set_languages', 'button-release-event']

Dan di akhir file yang sama (Preferensi $ PROJECTNAME $ Dialog.py), tambahkan

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

Jika Anda tertarik melihat upaya saya untuk satu dan dua, saya senang untuk menurut.

Sunting: Untuk pembaca biasa, ganti setiap kemunculan $ PROJECTNAME $ dengan nama sebenarnya dari proyek cepat Anda (sebagaimana ditentukan dalam quickly create).

HTH!

mwalsh
sumber
Ini berfungsi dengan sangat baik dan tampaknya cukup jelas, sehingga dua upaya lainnya tidak diperlukan, tetapi terima kasih lagi untuk mencobanya ... Karena jawaban Anda sangat panjang tetapi masih jelas, Anda mungkin ingin mengembangkannya menjadi tutorial lengkap di sini: developer.ubuntu.com/resources/tutorials/semua Pokoknya: terima kasih lagi!
xubuntix
@ xubuntix Itu ide yang menarik, saya akan memeriksanya. Terima kasih atas tautan dan perwakilannya!
mwalsh
0

Saya sendiri belum mencoba 'cepat', tetapi dengan pengalaman GTK saya akan menggunakan Tombol Radio untuk menangani pemilihan bahasa.

Menonton toggledacara bersama button.get_active()metode harus cukup untuk memeriksa apa yang telah dipilih pengguna.

Alexandre
sumber
Mengikuti saran Anda, saya melihat lagi pada Tombol Radio tetapi itu tampaknya tidak ideal: Karena daftar bahasa yang mungkin jauh lebih lama maka dapat dengan baik diberikan oleh Tombol Radio, satu-satunya alternatif adalah memiliki widget terpisah yang menambahkan tombol radio tambahan, dan semua tombol radio selalu aktif. Sepertinya tidak begitu baik.
xubuntix
Pastikan Anda menggunakan grup radio dengan benar. Selain itu, toggledacara ini dapat digunakan baik untuk tombol yang dipilih maupun yang tidak dipilih, karena itu harus cukup.
Alexandre
Maksud saya adalah: memiliki 200 tombol radio bukanlah antarmuka pengguna yang baik. Yang saya butuhkan adalah cara untuk menyimpan daftar tempat item dapat ditambahkan dan dihapus sesuai permintaan.
xubuntix