2016-08-02 9 views
0

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.

Antwort

3

Sie könnten immer lambda verwenden, hier ist ein kurzes Beispiel, das nichts tut.

import tkinter as tk 

def test(arg1, arg2): 
    print(arg1, arg2) 

root = tk.Tk() 
root.after_idle(lambda: test(arg1=1, arg2=2)) 
root.mainloop() 
+0

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

+0

Macht nichts, ich habe es herausgefunden. Ich brauche Lambda als Callback-Funktion, die sendMessage korrekt aufrufen wird. Vielen Dank! – linus72982

+0

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

Verwandte Themen