Seite 1 von 1

.trace() methode zum export von daten

Verfasst: Dienstag 18. Juli 2017, 15:48
von Kniffte
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

Re: .trace() methode zum export von daten

Verfasst: Dienstag 18. Juli 2017, 16:07
von 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?

Re: .trace() methode zum export von daten

Verfasst: Dienstag 18. Juli 2017, 18:04
von Kniffte
@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?

Re: .trace() methode zum export von daten

Verfasst: Dienstag 18. Juli 2017, 20:27
von __deets__
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.

Re: .trace() methode zum export von daten

Verfasst: Mittwoch 19. Juli 2017, 08:00
von Kniffte
@__deets__:
Danke...werde mich mal dran versuchen.