Я пишу gui в tkinter и используя модуль публикации/подписки (pyPubSub), чтобы информировать разные части программы о том, что происходит, если они подписаны. Итак, у меня есть две функции, которые мне нужны для совместной работы. Из tkinter я использую:Python 3 - использование kwargs только с модулем args
after_idle(callback, *args)
, чтобы вызвать отправку сообщения в mainlop. Как вы можете видеть, он принимает только * args аргументы для отправки обратного вызова. Обратный вызов я посылаю от pyPubSub:
sendMessage(topic, **kwargs)
Итак, я в конечном итоге с этим:
root.after_idle(pub.sendMessage, ?)
Мой вопрос, как я могу сделать арг работать с kwargs? Мне нужно вызвать after_idle с позиционными аргументами для отправки с обратным вызовом, но для обратного вызова требуются только аргументы ключевых слов.
Я думаю, я не уверен, как это исправить. Например, у меня есть gui_obj.after_idle (pub.sendMessage, * package) по мере необходимости, и пакет выглядит следующим образом: [, ], например (иногда бывает несколько аргументов, иногда нет, это не работает так или иначе). Когда after_idle регистрирует обратный вызов, он вызывает sendMessage (, ), и я не могу понять, как получить его, чтобы отправить его как sendMessage (, msg = ), так как требуется sendMessage. Я продолжаю получать: TypeError: sendMessage() принимает 2 позиционных аргумента, но 3 дано –
linus72982
Ничего, я понял. Мне нужно использовать лямбда как функцию обратного вызова, которая затем правильно вызовет sendMessage. Благодаря! – linus72982
Исключение «принимает 2 позиционных аргумента» было вызвано тем, что after_idle не отправил его правильно. sendMessage хотел 2 позиционных args (self и topic), а затем kwargs. after_idle отправлял тему и необязательные аргументы как позиционные, поэтому получал 3 позиционных элемента (1 из которых сам), когда он только хотел 2 (технически только один из меня и 1 из себя) – linus72982