.trace() methode zum export von daten

Fragen zu Tkinter.
Antworten
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

Halo Zusammen,

Ich habe im View einen Datenklasse die verschiedene Tkinter-Variablen enthält:

Code: Alles auswählen

class ExportImportMixin:
    def import_data(self, sender_dict):
        try:
            for key in self.EXPORT_IMPORT_ATTRIBUTES:
                getattr(self, key).set(sender_dict[key])
        except ValueError:
            pass
        except (IndexError, KeyError):
            print('Import of view data', self.__class__.__name__, 'failed...')
            return 0

    def export_data(self):
        data_to_export = {}
        try:
            for key in self.EXPORT_IMPORT_ATTRIBUTES:
                data_to_export[key] = getattr(self, key).get()
            return data_to_export
        except ValueError:
            pass
        except (IndexError, KeyError):
            print('Export of view data', self.__class__.__name__, 'failed...')
            return 0


class DataContainer(ExportImportMixin):

    EXPORT_IMPORT_ATTRIBUTES = ['work_directory',
                                'nomenclature',
                                'wheel_type',
                                'rotation_direction',
                                'blade_count_main',
                                'blade_count_splitter']

    def __init__(self, controller):
        self.ctrl = controller

        self.work_directory = tk.StringVar()
        self.nomenclature = tk.StringVar()
        self.wheel_type = tk.StringVar()
        self.rotation_direction = tk.StringVar()
        self.blade_count_main = tk.IntVar()
        self.blade_count_splitter = tk.IntVar()

Ich habe nun für jede Tkinter-variable eine .trace('w', ...) Methode definiert, die beim ändern der Variable im View die Daten vom View zum Model überträgt. Soweit in Ordnung...
Bei bestimmten Änderungen/Eingaben im View ist es aber so, dass im Model nach Erhalt der Daten noch Berechnungen ausgelöst werden und
im Anschluss das Model berechnete/ geänderte Daten an den View zurücksendet. Ebenfalls In Ordnung...
Da aber durch das Zurücksenden von Daten aus Model die Tkinter-Variablen im View wieder überschrieben werden, sendet ja der View gleich im Anschluss, aufgrund der definierten .trace('w', ...) Methoden die eben erhaltenen Daten nochmal zurück an das Model.
An sich erstmal nicht schlimm, aber unnötig und mir will grad keine Lösung einfallen, wie ich dies umgehen kann?! Ich hoffe auf Hilfe/ Denkanstöße von euch.

Gruß Seb
BlackJack

@Kniffte: Nicht zur eigentlichen Frage: Diese ``return 0`` im Ausnahmefall sind genau das was man durch Ausnahmen eigentlich abschaffen wollte. Es zwingt den Aufrufer spezielle Fehlerwerte zu prüfen oder macht es entweder wahrscheinlicher das Fehler ignoriert werden oder zu Folgefehlern führen wo man dann erst einmal die Ursache suchen muss. Die (nicht)behandlung vom `ValueError` verstehe ich auch nicht. Das führt beim `export_data()` zu der echt schrägen API, dass die Methode ein Wörterbuch, `None`, oder 0 zurückgeben kann. Wie sieht denn da bei Dir der Code beim Aufrufer aus der diese Fälle unterscheidet?
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@BlackJack:
Bzgl. der Behandlung des ValueError hatte ich schon mal folgenden Thread gestartet:
viewtopic.php?f=18&t=40691&p=310700#p310700
Ich fange hier den Fehler ab, dass Tkinter beim Löschen eines Entry-Widgets mit DoubleVar() den leeren String in einen Float umwandeln möchte.
Das 'return 0' ist nicht final...Ich habe in der Anwendung ein Statusobjekt, in das ich alle (Fehler)-Meldungen übergebe und werde hier am Ende einen String als Rückgabewert definieren.

Kannst du mir bei meiner eigentlich Frage ggf. auch weiterhelfen?
__deets__
User
Beiträge: 14539
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich denke dir bleibt nichts anderes übrig als die trace Funktionen mit Thread-lokalem Zustand zu versehen, der den wiedereintritt erkennt und eine Kaskadierung verhindert. Würde ich aber nur machen, wenn es sein muss, um sonst endlose updates zu verhindern oder visuelle artefakte. Wenn es nur um Effizienz geht aus Prinzip würde ich da nix unternehmen.
Kniffte
User
Beiträge: 64
Registriert: Dienstag 27. September 2016, 11:05

@__deets__:
Danke...werde mich mal dran versuchen.
Antworten