Schnelle Anwendung mit ListStore als Voreinstellung

Schnelle Anwendung mit ListStore als Voreinstellung

Ich fange an, ein Programm mit 'quickly' zu schreiben. Eine Liste der gewünschten Sprachen wird als eine der Präferenzoptionen dienen. Beispiel:

languages = ["en", "de"]

Der (automatisch erstellte) Schnellcode, der den Präferenzteil behandelt, sieht folgendermaßen aus:

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

In der GUI scheint es, als ob das Widget der Wahl in GTK für eine Liste ein ListStore ist (was kein Widget, sondern ein Modell ist, aber in der Glade-Datei definiert ist ...). Kann mir jemand sagen, was für einen ListStore für 'getter'und 'setter'im 'changed'obigen Code funktionieren würde?

Der Ansatz sieht für einfache Eingabe-Widgets und dergleichen einfach aus, aber ich weiß nicht, wie ich ihn mit Listen verwenden soll.

Alternativ würde ich natürlich auch jede andere Möglichkeit zum Umgang mit Listen als Präferenzen akzeptieren, vorausgesetzt, die Länge der Liste ist nicht festgelegt.

Antwort1

Haftungsausschluss: Ich wusste nichts überschnellbis ich Ihren Beitrag gelesen habe, oder über GUI-Programmierung im Allgemeinen. Daher steht es mir ehrlich gesagt nicht zu, diese Frage zu beantworten :)

Das gesagt,schnellist ein tolles Projekt. Ich habe den Quelltext kurz durchgesehen und die folgenden möglichen Ansätze zum Hinzufügen einer ListStore-gestützten Listenstil-Präferenz identifiziert:

  1. „Monkey-Patch“ ruft Widgetmethoden ab und legt sie auf einem Standard-TreeView-Widget (mit ListStore-Modell) fest, wie in data/ui/Preferences$PROJECTNAME$Dialog.ui mit Glade definiert.
  2. Implementieren Sie set_widget_from_preferenceund set_preferencein der Unterklasse von PreferencesDialog des Projekts (die Unterklasse ist Preferences$PROJECTNAME$Dialog) und machen Sie etwas anderes, wenn keyoder widgetIhr von ListStore unterstütztes TreeView-Widget ist.
  3. Schreiben Sie eine benutzerdefinierte Unterklasse von gtk.TreeView mit einem passendenbenutzerdefiniertes Widget für Glade.

Um sie zu testen, habe ich alle drei Ideen umgesetzt – jede funktionierte wie beabsichtigt und meines Wissens nach identisch. Am Ende schien mir die dritte (insbesondere) die sauberste und näher an den Konventionen zu sein, die im gesamten Boilerplate verwendet werden, obwohl ich zunächst das Gegenteil erwartet hatte.


Hier sind die Schritte, die ich für Nummer drei befolgt habe ...

Mit Glade via quickly design(quickly 11.10, übrigens) und lockerem Befolgendieses Tutorial (Teil 2), fügen Sie ein ScrolledWindow-Widget zu Preferences$PROJECTNAME$Dialog.ui hinzu, ziehen Sie ein TreeView darauf und benennen Sie das TreeView language_treeview. Erstellen Sie bei entsprechender Aufforderung ein neues ListStore-Modell für das TreeView und nennen Sie es language_liststore usw. ... Schließlich kam ich auf so etwas wie das hier:

Lichtung-Eigenschaften

Fügen Sie als Nächstes einen Glade-Katalog (data/ui/preferences_$PROJECTNAME$_treeview.xml) mit dem folgenden Inhalt hinzu:

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

Bearbeiten Sie dann Preferences$PROJECTNAME$Dialog.ui und fügen Sie hinzu …

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

... nach oben, unter das Tag „requires“. Und ändern Sie das Klassenattribut von language_treeview in Preferences$PROJECTNAME$TreeView, als Vorbereitung für einen späteren Schritt.

Fügen Sie abschließend das folgende Element zur Liste widget_methods in Preferences$PROJECTNAME$Dialog.py hinzu

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

Und am Ende der gleichen Datei (Preferences$PROJECTNAME$Dialog.py) fügen Sie hinzu

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

Wenn Sie Interesse daran haben, meine Versuche für eins und zwei zu sehen, bin ich gerne bereit, diesem Wunsch nachzukommen.

Bearbeiten:Für den Gelegenheitsleser ersetzen Sie jedes Vorkommen von$PROJEKTNAME$mit dem tatsächlichen Namen IhresschnellProjekt (wie in angegeben quickly create).

HTH!

Antwort2

Ich habe es selbst nicht mit "schnell" versucht, aber mit meiner GTK-Erfahrung würde ich verwendenRadio Knöpfeum die Sprachauswahl zu handhaben.

Das Beobachten des toggledEreignisses zusammen mit der button.get_active()Methode sollte ausreichen, um zu überprüfen, was der Benutzer ausgewählt hat.

verwandte Informationen