Ich schreibe eine GUI in tkinter und verwende ein Publish/Subscribe-Modul (pyPubSub), um verschiedene Teile des Programms darüber zu informieren, was passiert, wenn sie abonniert sind. Also, ich habe zwei Funktionen, die ich zusammenarbeiten muss. Von tkinter verwende ich:Python 3 - Verwenden von Kwargs mit nur einem Modul args
after_idle(callback, *args)
, um die Nachricht zu senden, die innerhalb der Hauptschleife sendet. Wie Sie sehen, akzeptiert es nur * Argumente für die Argumente, die an den Callback gesendet werden. Der Rückruf Ich schicke ist von pyPubSub:
sendMessage(topic, **kwargs)
Also, ich mit diesem Ende:
root.after_idle(pub.sendMessage, ?)
Meine Frage ist, wie kann ich args mit kwargs arbeiten? Ich muss after_idle mit Positionsargumenten aufrufen, um mit dem Rückruf zu senden, aber der Rückruf erfordert nur Schlüsselwortargumente.
Ich denke, ich bin mir nicht sicher, wie das es beheben würde. Zum Beispiel habe ich gui_obj.after_idle (pub.sendMessage, * Paket) wie es benötigt und Paket sieht so aus: [, ], zum Beispiel (manchmal gibt es mehr als ein arg, manchmal nicht, es funktioniert nicht in jedem Fall). Wenn after_idle den Rückruf registriert, ruft er sendMessage (, ) auf und ich kann nicht herausfinden, wie er es als sendMessage (, msg = ) senden kann, wie sendMessage erfordert. Ich bekomme immer: TypeError: sendMessage() nimmt 2 Positionsargumente, aber 3 wurden gegeben –
linus72982
Macht nichts, ich habe es herausgefunden. Ich brauche Lambda als Callback-Funktion, die sendMessage korrekt aufrufen wird. Vielen Dank! – linus72982
Die Ausnahme "takes 2 positional arguments" wurde verursacht, weil after_idle sie nicht korrekt gesendet hat. sendMessage wollte 2 Positionsargumente (Selbst und Thema) und dann Kwargs. after_idle hat das Thema und die optionalen Argumente sowohl als Position als auch als Positional gesendet (1 davon ist selbst), wenn es nur 2 wollte (technisch nur eine von mir und 1 von selbst) – linus72982