Gui-Anderung einer Eigenschaft in einem anderen Modul

Fragen zu Tkinter.
Alfons Mittelmeyer
User
Beiträge: 1715
Registriert: Freitag 31. Juli 2015, 13:34

@pillmuncher: Wenn Du ein Pilosoph bist, dann haben wir etwas gemeinsam. Und unsere Diskussionen werden nicht so sein, dass jemand versucht den anderen nierderzumachen, weil er nicht dieselben Überzeugungen teilt oder nicht dasselbe glaubt. Denn Glauben ist ein Fremdwort für Philosophen. Da gilt der Grundsatz des Sokrates: "scio, nescio"

Ein Philosoph weiß viel. Er weiß bei Vielem, ob es richtig ist oder ob es falsch ist, denn er hat es erkannt. Und ob sonst noch etwas stimmt oder nicht, das weiß er nicht und läßt es dabei. Andere aber wollen sich mit derartigem Unwissen nicht abfinden und glauben dies oder jenes, weil vielleicht jemand, dem sie glauben, es gesagt oder geschrieben hat.

Vielleicht sind Viele hier im Forum nicht glücklich mit mir, dass sie mich nicht überzeugen oder belehren können. Aber ich erkenne es einfach nicht als wahr an, solange es nicht zweifelsfrei bewiesen ist.
Vielleicht halten mich Viele jetzt für stockkonservativ, weil ich alles bezweifle, aber richtig bezweifeln heißt doppelt bezweifen, nämlich, ob die eigenen Zweifel angebracht sind, und ob es nicht sein kann, dass das was Viele glauben, dass es falsch ist, nicht doch stimmen könnte.

Auf der einen Seite bezweifle ich alles und auf der anderen Seite halte ich auch alles für möglich und bin daher auch ungeheuer aufgeschlossen und offen für Neues.
Hat das jemand verstanden?

@pillmuncher, bitte entschuldige diesen kleinen Exkurs. Aber unsere Diskussion hat mir sehr viel gebracht. Denn ich hatte nun nachgedacht, ob es ein Eventbus ist oder ein Proxy.

Die Antwort ist, es ist ein Proxy, denn Eventbus ist nur eine Default-Einstellung. Mir ist nämlich in den Sinn gekommen, dass man etwa auch Nachrichten austauschen könnte mit anderen gleichzeitig laufenden Python Anwendungen auf dem selben Computer als auch völlig woanders. Serialisieren einer Message ist in Python ganz einfach. Eine serialisierte Message sieht man mit 'print' und bekommt man mit 'str' und die Rückverwandlung geschieht ganz einfach mit 'eval'. Daher ist das Senden von Nachrichten gar kein Problem.

Eine klitzekleine Änderung meines Proxies machte Nachrichtenaustausch mit anderen Threads möglich. Es war das packed Flag. Und eine weitere kleine Änderung macht auch Kommunikation über Netzwerke und dergleichen möglich. Dazu betrachten wir einmal folgende Zeilen aus der Methode 'work':

Code: Alles auswählen

for receive,packed in receivers:
    if packed: receive((msgid,msgdata))
    else: receive(msgdata)
Hier stand 'receive' für eine Callback Funktion. Aber das ist viel zu einschränkend. Richtig muss es heißen 'receiver' statt 'receive' und was wir damit tun ist 'transmit':

Code: Alles auswählen

for receiver,packed in receivers:
    if packed: self.transmit(receiver,(msgid,msgdata))
    else: self.transmit(receiver,msgdata)
Und die default Einstellung für transmit ist ein Callback. Das erreichen wir mit folgenden Definitionen im Proxy:

Code: Alles auswählen

def callback(self,receiver,message): receiver(message)

self.transmit = self.callback
Und transmit können wir je nach Bedarf umstellen. Dann könnte receiver etwa auch eine IP Adresse oder ein File Descriptor sein.

Allerdings fehlt da noch etwas. Dieser Proxy würde nur Gleichartiges mit Gleichartigem verbinden. Wir brauchen aber noch die Umwandlung von Callbacks oder was auch immer in Transmissions und umgekehrt.
Das könnte man zwar mit einem weiteren Flag regeln, aber das erscheint mir zu wenig. Ich denke eher an an eine Umwandlung von Transmission Typ X in Transmission Typ Y.

Aber vielleicht ist das Callback Prinzip auch gar nicht verkehrt und wir brauchen evtl. nur noch einen zusätzlichen Parameter für die Registrierung?

Wenn wir bei der ursprünglichen Implementierung bleiben und das packed Flag modifizieren, könnte es vielleicht bereits die Lösung sein:

Code: Alles auswählen

for receive,packed in receivers:
    if type(packed) is bool:
        if packed: receive((msgid,msgdata))
        else: receive(msgdata)
    else: receive((packed,(msgid,msgdata)))
Das schaut nicht schlecht aus: Angenommen die Empfänger wären verschiedene Files oder Pipes oder auch IP Adressen, dann würden wir die entsprechenden Callbacks angeben und als packed File-Deskriptoren oder IP Adressen. Und umgekehrt hätten wir verschiedene Trigger und damit verbundene Funktionen, welche dann die serialisierten Messages in Message ID und Parameter konvertieren und dann mit send auf die Queue legen.

Sieht doch gut aus, oder?

Aber mit dieser Implementierung wäre es doch wohl wieder Eventbus Prinzip.
Antworten