Applicazione rapida con ListStore come preferenza


10

Sto iniziando a scrivere un programma con 'rapidamente'. Un elenco delle lingue desiderate sarà uno preferito. Esempio:

languages = ["en", "de"]

Il codice (creato automaticamente) che gestisce rapidamente la parte delle preferenze è simile al seguente:

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

Nella GUI, sembra che il widget preferito in gtk per un elenco sia un ListStore (che non è un widget, ma un modello, ma è definito nel file Glade ...). Qualcuno può dirmi cosa funzionerebbe per un ListStore per il 'getter', 'setter'e 'changed'nel codice sopra?

L'approccio sembra semplice per semplici widget di accesso e simili, ma non so come usarlo con le liste.

In alternativa, accetterei ovviamente qualsiasi altro modo di trattare gli elenchi come preferenze, a condizione che la lunghezza dell'elenco non sia fissa.


Non è una risposta alla domanda, ma perché la tua app deve cambiare lingua? Non può semplicemente usare gettext e le impostazioni internazionali definite dall'utente per determinare la lingua? Questo è il modo standard di gestire le traduzioni di un'applicazione: funzionerebbe automaticamente e sarebbe molto meno lavoro per te.
David Planella,

@DavidPlnella: una buona domanda. Non cambia lingua. L'app cerca episodi TV in un database. Poiché molte persone parlano più di una lingua, è possibile recuperare episodi in tutte. Esempio: guardo episodi TV tedeschi e inglesi.
Xubuntix,

Risposte:


2

Disclaimer: non sapevo nulla di quanto prima non avessi letto il tuo post o della programmazione della gui in generale. Pertanto, sinceramente, non ho intenzione di rispondere a questa domanda :)

Detto questo, rapidamente è un progetto pulito. Ho scansionato brevemente la fonte del boilerplate e identificato i seguenti potenziali approcci per l'aggiunta di una preferenza di stile elenco supportata da ListStore:

  1. 'Monkey-patch' ottiene e imposta widget_methods su un widget TreeView di serie (con il modello ListStore) come definito in data / ui / Preferenze $ PROJECTNAME $ Dialog.ui con glade.
  2. Implementa set_widget_from_preferencee set_preferencenella sottoclasse di PreferenzeDialog del progetto (la sottoclasse è la finestra Preferenze $ PROJECTNAME $) e fai qualcosa di diverso quando keyo widgetè il tuo widget TreeView supportato da ListStore.
  3. Scrivi una sottoclasse personalizzata di gtk.TreeView con un widget personalizzato corrispondente per glade .

Per provarli, ho implementato tutte e tre queste idee - ognuna ha funzionato come previsto e AFAICT, in modo identico. Alla fine, il terzo (in particolare) mi è sembrato il più pulito, e più vicino alle convenzioni utilizzate in tutta la caldaia, nonostante inizialmente si aspettasse il contrario.


Ecco i passaggi che ho seguito per il numero tre ...

Usando glade via quickly design(rapidamente 11.10, tra l'altro), e seguendo vagamente questo tutorial (parte 2) , aggiungi un widget ScrolledWindow a Preferenze $ PROJECTNAME $ Dialog.ui, rilascia un TreeView su di esso, dai un nome a TreeView language_treeview. Crea un nuovo modello ListStore per TreeView quando richiesto e chiamalo language_liststore, ecc ... alla fine ho finito con qualcosa del genere:

radura-properties

Quindi, aggiungi un catalogo glade (data / ui / preferenze_ $ PROJECTNAME $ _treeview.xml) con i seguenti contenuti:

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

Quindi, modifica Preferenze $ PROJECTNAME $ Dialog.ui, aggiungendo ...

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

... verso l'alto, sotto il tag richiede. E modifica l'attributo class di language_treeview in Preferenze $ PROJECTNAME $ TreeView, in preparazione per un passaggio successivo.

Infine, aggiungi il seguente elemento all'elenco widget_methods in Preferenze $ PROJECTNAME $ Dialog.py

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

E alla fine dello stesso file (Preferenze $ PROJECTNAME $ Dialog.py), aggiungi

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

Se sei interessato a vedere i miei tentativi per uno e due, sono felice di accontentarti.

Modifica: per il lettore occasionale, sostituisci qualsiasi occorrenza di $ PROJECTNAME $ con il nome effettivo del tuo progetto rapido (come specificato in quickly create).

HTH!


Funziona molto bene e sembra abbastanza chiaro, quindi gli altri due tentativi non sono necessari, ma grazie ancora per averli provati ... Dato che la tua risposta è molto lunga ma ancora chiara, potresti voler estenderla in un tutorial completo qui: developer.ubuntu.com/resources/tutorials/all Comunque: grazie ancora!
xubuntix,

@xubuntix È un'idea interessante, la esaminerò. Grazie per il link e il rappresentante!
mwalsh,

0

Non ho provato 'velocemente' me stesso, ma con la mia esperienza GTK avrei usato i pulsanti radio per gestire la selezione della lingua.

Guardare l' toggledevento insieme al button.get_active()metodo dovrebbe essere sufficiente per verificare ciò che l'utente ha selezionato.


Seguendo il tuo suggerimento, ho guardato di nuovo i pulsanti radio, ma questo non sembra l'ideale: poiché l'elenco delle lingue possibili è molto più lungo, allora può essere ben fornito dai pulsanti radio, l'unica alternativa sarebbe quella di avere un widget separato che aggiunge ulteriori pulsanti radio, e tutti i pulsanti radio sono sempre attivi. Non sembra così carino.
xubuntix,

Assicurarsi di utilizzare correttamente i gruppi radio. Inoltre, l' toggledevento può essere utilizzato sia per i pulsanti selezionati che per quelli non selezionati, ecco perché dovrebbe essere sufficiente.
Alexandre,

Quello che volevo dire è: avere 200 pulsanti di opzione non è una buona interfaccia utente. Ciò di cui ho bisogno è un modo per memorizzare un elenco in cui gli elementi possono essere aggiunti e rimossi su richiesta.
xubuntix,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.