canvas und button

Fragen zu Tkinter.
Benutzeravatar
__blackjack__
User
Beiträge: 14031
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@Sirius3: Ja, ich hatte da nur die Frage beantwortet wie man GUI-Methoden aus einem anderen Thread heraus aufrufen kann, also den Aufruf in den anderen Thread verlegt.

@reinerdoll: Zur Umsetzung würde ich persönlich ja erst einmal nur die Simulation komplett ohne GUI umsetzen, dann kommt man gar nicht erst in Versuchung da irgendwo GUI-Code aufrufen zu wollen, denn den gibt es ja noch gar nicht.

Und ich würde für eine reine Simulation auch keine Threads verwenden. Man kann das ja trotzdem nebenläufig implementieren und damit auch ohne Threads die gleichen Probleme simulieren. Threads sind ja nur notwendig wenn man tatsächlich nebenläufig mit externen Ressourcen interagieren möchte, die man nicht simuliert. Wobei da dann ``async`` vielleicht noch eine Möglichkeit wäre auch dabei Threads zu vermeiden, aber ich persönlich finde ``async`` unbrauchbar ausserhalb von irgendwas wo Socket-Kommunikation drunter liegt. Bei JavaScript ist das toll, aber da ist auch die gesamte Sprache darauf ausgelegt. Bei Python hat man zwei Welten die nicht schön miteinander können und ausserhalb von Sockets braucht's dann doch wieder Threads und davon auch noch mehr und für jeden Pups der etwas länger dauert, was die Programme dann im Endeffekt *langsamer* machen kann.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Benutzeravatar
__blackjack__
User
Beiträge: 14031
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

Man könnte diese Queue auch in einer eigenen Klasse verpacken (ungetestet):

Code: Alles auswählen

class DeferredCalls:
    def __init__(self):
        self.queue = Queue()

    def add(self, function, *args, **kwargs):
        self.queue.put(partial(function, *args, **kwargs))

    def run_pending(self):
        while True:
            try:
                call = self.queue.get(block=False)
            except Empty:
                break
            else:
                try:
                    call()
                except Exception:
                    logging.exception("calling %r", call)
                finally:
                    self.queue.task_done()

    def join(self):
        self.queue.join()
`partial()` ist aus dem Modul `functools`.
„A life is like a garden. Perfect moments can be had, but not preserved, except in memory. LLAP” — Leonard Nimoy's last tweet.
Antworten