Viele Dialogfenster erzeugen ?

Fragen zu Tkinter.
Antworten
abgdf

Hallo,

ich möchte gern mit Tkinter 117 Eingaben auf 17 Dialogfenstern vom Benutzer abfragen.
(Im Moment mache ich das ohne GUI mit einer Konfigurationsdatei mit 17 Sektionen, die ich mit dem Modul "ConfigParser" verarbeite. Aber ein GUI wäre schon schön ...)

Seht ihr da eine Möglichkeit, mit einer Basisklasse für die Tkinter-Dialogfenster und Vererbung zu arbeiten ?
Kennt ihr vielleicht sogar ein Code-Beispiel ? Ich möchte ungern jedes Fenster einzeln programmieren ...

Vielen Dank
lunar

Wenn du auf ConfigObj wechseln und seine ConfigSpec schreiben kannst, ist die Sache mehr oder weniger trivial.

Du kannst dann einfach über die Sektionen und Schlüssel in der Spec iterieren, und jeden Schlüssel als Label mit einem Eingabefeld darstellen. Mit ein bisschen mehr Arbeit kannst du sogar Validierung einbauen und damit somit fehlerhafte Eingaben noch in der GUI abfangen und anzeigen.

Dann braucht es gar keine einzelnen Klassen für jedes Dialogfenster, stattdessen nur ein "SectionDialog" (oder ähnlich ;) ), der eine bestimmte Sektion bearbeiten kann.
abgdf

Hallo,

danke für die Antwort. "ConfigParser" kommt aber ganz gut mit der Config-Datei zurecht. Das ist nicht das Problem.
Die Fenster sollen manchmal aber etwas anders aussehen.
Z.B. sind manchmal Adressdaten einzugeben, manchmal nicht. Es sind keine Konfigurationsoptionen, die in irgendeiner Reihenfolge abgefragt werden könnten, sondern die Reihenfolge ist schon wichtig, jedenfalls, wenn es "normal" aussehen soll.
Manche Optionen sind auch vom Typ "Bool", so daß dann "CheckButton"s zum Einsatz kommen sollten.

Hat noch jemand eine Idee zu einer Basisklasse für die Dialogfenster mit Vererbung ?

Gruß
BlackJack

@abgdf: Hast Du Dir `ConfigObj` und `ConfigSpec` mal angeschaut? Letzteres beschreibt die Konfigurationsdatei, sprich welche Schlüssel darin vorkommen und welchen "Typ" die Werte haben sollen.
lunar

abgdf hat geschrieben:danke für die Antwort. "ConfigParser" kommt aber ganz gut mit der Config-Datei zurecht. Das ist nicht das Problem.
Es geht nicht darum, dass ConfigParser nicht mit der Datei zurecht kommt, sondern dass ConfigObj dir erlaubt, die Typen eines Schlüssel genau festzulegen und danach zu validieren!

Daraus kann man dann ziemlich schnell und ziemlich einfach einen generischen Konfigurationseditor stricken.
Die Fenster sollen manchmal aber etwas anders aussehen.
Z.B. sind manchmal Adressdaten einzugeben, manchmal nicht. Es sind keine Konfigurationsoptionen, die in irgendeiner Reihenfolge abgefragt werden könnten, sondern die Reihenfolge ist schon wichtig, jedenfalls, wenn es "normal" aussehen soll.
Mit etwas Aufwand ließe sich das auch noch in das obigen Beispiel einarbeiten.
Hat noch jemand eine Idee zu einer Basisklasse für die Dialogfenster mit Vererbung?
Wenn deine Konfigurationsdaten so verschieden sind, dass du mit einem generischen Ansatz nicht weit kommen kannst, dann hilft dir auch Vererbung nicht wirklich. Wenn jedes Fenster unterschiedlich ist, wo soll dann die gemeinsame Basis für Vererbung sein?

Das einzige, was dann sinnvoll wäre, ist das Gruppieren der Einstellungen. So könntest du ein Widget erstellen, welches die erwähnten Adressdaten editiert, und das dann relativ generisch halten.
abgdf

Hallo,
Hast Du Dir `ConfigObj` und `ConfigSpec` mal angeschaut?
Nur kurz die Beschreibung angesehen.

Also, mit "ConfigParser" kann ich auch sections, options und values erzeugen und darauf in einem Objekt zugreifen:

Code: Alles auswählen

#!/usr/bin/env python

import ConfigParser

cpars = ConfigParser.ConfigParser()

cpars.add_section("Sec1")

cpars.set("Sec1", "Opt1", "Val1")
cpars.set("Sec1", "Opt2", "Val2")

cpars.add_section("Sec2")

cpars.set("Sec2", "Opt1", "Val1")
cpars.set("Sec2", "Opt2", "Val2")

for i in cpars.sections():
    for u in cpars.options(i):
        print i, u, cpars.get(i, u)
Ich könnte damit auch alles auf einmal in eine ".ini"-Datei schreiben. Vielleicht kann ich keinen "Typ" der Werte festlegen, aber das brauche ich, glaube ich, auch nicht (das Beispielskript kann ich mangels Qt4 (hab' nur Qt3) leider nicht ohne weiteres testen). Ich hätte aber auch gar nicht "ConfigParser" oder ähnliches verwenden müssen.
Ich könnte ja auch alle Eingaben zur Not mit "raw_input()" direkt abfragen.

Vielleicht muß ich wirklich alle 17 Fenster einzeln schreiben :grusel:.
Aber viele hätten eben zahlreiche Eingabefelder, und sie würden sich auch irgendwie ähnlich verhalten ...
Ich muß nochmal drüber nachdenken ...

Viele Grüße
abgdf

Hallo,

hab' jetzt einen Lösungsansatz :P:

Ich baue die Elemente IN DEN Dialogfenstern als eigene Klassen und binde diese dann jeweils in das Dialogfenster ein oder auch nicht.

Viele Grüße
Antworten