ListStore ile tercihinize göre hızlı uygulama


10

'Hızlı' ile bir program yazmaya başlıyorum. İstenen dillerin listesi bir tercih olacaktır. Misal:

languages = ["en", "de"]

Tercih bölümünü işleyen (otomatik olarak oluşturulan) hızlı kod şöyle görünür:

# 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'de, bir liste için gtk'deki seçim widget'ı bir ListStore (bir widget değil, bir model, ancak Glade dosyasında tanımlanmış ...) gibi görünüyor. Birisi ne için ListStore için işe söyleyebilir 'getter', 'setter've 'changed'yukarıdaki kodda?

Yaklaşım basit giriş widget'ları ve benzeri için kolay görünüyor, ancak listelerle nasıl kullanılacağını bilmiyorum.

Alternatif olarak, listenin uzunluğunun sabit olmaması şartıyla elbette listelerle başa çıkmak için başka bir yolu kabul ederim.


Sorunun yanıtı değil, ancak uygulamanızın neden dil değiştirmesi gerekiyor? Dili belirlemek için gettext'i ve kullanıcının tanımladığı yerel ayarı kullanamaz mı? Bir uygulamanın çevirilerini ele almanın standart yolu budur: otomatik olarak çalışır ve sizin için çok daha az işe yarar.
David Planella

@DavidPlnella: iyi bir soru. Dil değiştirmez. Uygulama, bir veritabanındaki TV bölümlerini arar. Birçok kişi birden fazla dil konuştuğundan, hepsinde bölümler alınabilir. Örnek: Almanca ve İngilizce TV bölümlerini izliyorum.
xubuntix

Yanıtlar:


2

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:

  1. '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.
  2. Uygulamak set_widget_from_preferenceve set_preferencePreferencesDialog projenin alt sınıfta (alt sınıf Tercihleri olduğunu $ ProjeAdı $ Diyalog) ve zaman farklı bir şey yapmak keyya widgetda ListStore TreeView Widget desteklenmektedir.
  3. 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:

kayranın-özelliklerini

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!


Bu çok iyi çalışıyor ve oldukça net görünüyor, bu yüzden diğer iki denemeye gerek yok, ancak onları denediğiniz için tekrar teşekkürler ... Cevabınız çok uzun ama yine de açık olduğundan, burada tam bir öğreticiye genişletmek isteyebilirsiniz: developer.ubuntu.com/resources/tutorials/all Yine de: tekrar teşekkürler!
xubuntix

@xubuntix Bu ilginç bir fikir, içine bakacağım. Bağlantı ve temsilci için teşekkürler!
mwalsh

0

Kendimi 'çabucak' denemedim, ancak GTK deneyimimle, dil seçimini yapmak için Radyo Düğmelerini kullanardım.

toggledEtkinliği button.get_active()yöntemle birlikte izlemek kullanıcının ne seçtiğini kontrol etmek için yeterli olmalıdır.


Önerilerinizin ardından tekrar Radyo Düğmelerine baktım, ancak bu ideal görünmüyor: Olası diller listesi çok daha uzun olduğundan Radyo Düğmeleri tarafından güzel bir şekilde verilebildiğinden, tek alternatif ek radyo düğmeleri ekleyen ayrı bir widget'a sahip olmak, ve tüm radyo düğmeleri her zaman etkindir. Çok hoş görünmüyor.
xubuntix

Radyo gruplarını doğru kullandığınızdan emin olun. Ayrıca, toggledolay hem seçili hem de seçili olmayan düğmeler için kullanılabilir, bu yüzden yeterli olmalıdır.
Alexandre

Demek istediğim: 200 radyo düğmesine sahip olmak iyi bir kullanıcı arayüzü değil. Ihtiyacım olan şey, öğeleri isteğe bağlı olarak eklenebilir ve kaldırılabilir bir liste depolamak için bir yoldur.
xubuntix
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.