wxPython中的sendMessage()函数最多接受3个参数(给定了4个)错误

3 投票
2 回答
4124 浏览
提问于 2025-04-17 21:36

我目前正在开发一个图形用户界面(GUI)应用程序,使用的是Python 2.7和wxPython 3.0,运行在Windows 7操作系统上。
我使用pubsub模块来向我的主GUI线程发送信息,以便更新我的界面。
我还使用wx.CallAfter()来将消息发送到主GUI循环。

问题:在我的程序中,有一个地方需要使用wx.CallAfter()发送两个lists,就像下面这样:

wx.CallAfter(pub.sendMessage, 'Update', ListA, ListB)

我遇到了以下错误:

sendMessage() takes at most 3 arguments (4 given)

有没有什么方法可以解决这个问题,而不需要修改接收这些消息的方法?

wx.CallAfter(pub.sendMessage, 'Update', ListA)运行得很好。

谢谢你的时间。

回答:我使用了以下导入:

from wx.lib.pubsub import setuparg1
from wx.lib.pubsub import pub

我应该使用以下内容,这解决了我的问题:

from wx.lib.pubsub import setupkwargs
from wx.lib.pubsub import pub

2 个回答

3

使用命名参数。

wx.CallAfter(pub.sendMessage, 'Update', list1 = ListA, list2 = ListB)

这样写是可以的:

import wx

from wx.lib.pubsub import setupkwargs
from wx.lib.pubsub import pub


class Controller(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, -1, "Test")

        pub.subscribe(self.OnAppEvent, "APP_EVENT")
        wx.CallAfter(pub.sendMessage, "APP_EVENT", list1=('1','a'), list2=('2','b'))
        self.Show()

    def OnAppEvent(self, list1, list2):
        print list1, list2



app = wx.App()
controller = Controller()

app.MainLoop()
3

你只能通过关键词值来发送消息,所以你需要这样做:

from wx.lib.pubsub import pub 
...
wx.CallAfter(pub.sendMessage, 'Update', arg1 = ListA, arg2 = ListB)

arg1 和 arg2 必须和监听器的参数名一致(也就是说,所有监听特定主题(比如“更新”)的监听器,以及所有发送这个主题消息的地方,都必须使用相同的参数名称;不过参数的顺序不重要,这要感谢 Python 的关键词参数功能)。

注意:上面的内容假设你使用的是比较新版本的 pubsub,并且使用的是 pubsub 的默认消息协议,而不是 v1 或 arg1。你可以尝试打印 pub.VERSION_STR 或 pubsub.VERSION(后者只有在最新版本的 wxpython phoenix 中才有,可能不是你正在使用的版本)。另外,如果你看到 from wx.lib.pubsub import setupv1from wx.lib.pubsub import setuparg1,那么你就是在使用旧版的 pubsub,这个版本只接受一个消息数据,但不需要参数名称(这也可能是你遇到问题的原因)。

撰写回答