wxPython中的sendMessage()函数最多接受3个参数(给定了4个)错误
我目前正在开发一个图形用户界面(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 个回答
使用命名参数。
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()
你只能通过关键词值来发送消息,所以你需要这样做:
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 setupv1
或 from wx.lib.pubsub import setuparg1
,那么你就是在使用旧版的 pubsub,这个版本只接受一个消息数据,但不需要参数名称(这也可能是你遇到问题的原因)。