首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用pypubsub & wxpython在窗口之间传输数据,获取TypeError:

使用pypubsub & wxpython在窗口之间传输数据,获取TypeError:
EN

Stack Overflow用户
提问于 2021-05-27 05:12:12
回答 1查看 50关注 0票数 1

我正在尝试使用PyPubSub在两个wxpython窗口之间传递数据。下面我已经将代码精简为基本的部分。当我在主窗口的textcntrl中填写数据并点击按钮将其传递到第二个窗口(CoordFrame)时,我得到了以下错误-

TypeError: sendMessage()接受2个位置参数,但给出了3个

我能找到的每个示例都显示在pub.sendMessage中传递两个参数;这就是我认为我正在做的事情。传递的第三个参数是什么,它来自哪里,我如何停止它?我尝试了各种参数和数据类型的组合,包括二进制。

“”“

代码语言:javascript
复制
from pubsub import pub
import wx

class MainFrame (wx.Frame):
    def __init__(self, parent, title):
        super(MainFrame, self).__init__(parent, title = title, size = (200,200))
        self.panel = MainPanel(self)

class CoordFrame (wx.Frame):
    def __init__(self, parent, title):
        super(CoordFrame, self).__init__(parent, title = title, size = (200,200))
        self.panel = CoordPanel(self)


class MainPanel(wx.Panel):
    def __init__(self, parent):
        super(MainPanel, self).__init__(parent)
        vsizer = wx.BoxSizer(wx.VERTICAL)
    
        self.tbxNewMap = wx.TextCtrl(self, id=1001, pos=(20,20), size = (50,20) ,style = wx.TE_CENTER|wx.TE_NOHIDESEL|wx.TE_PROCESS_ENTER)
        vsizer.Add(self.tbxNewMap)

        self.btnEnterNewMap = wx.Button(self, id=1002, label = "New Data", pos = (20,80), size = (80,40))
        vsizer.Add(self.btnEnterNewMap,0,wx.EXPAND)
        self.Bind(wx.EVT_BUTTON, self.onButtonNewMap, id=1002)

    def onButtonNewMap(self,event):
        temp = self.tbxNewMap.GetValue()
        pub.sendMessage("coord_listener", temp)
        coordframe = CoordFrame(None,"Entry")
        coordframe.Show()

class CoordPanel(wx.Panel):
    def __init__(self, parent):
        super(CoordPanel, self).__init__(parent)
        vsizer = wx.BoxSizer(wx.VERTICAL)
        pub.subscribe(self.coord_listener, "coord_listener")

        self.tbxNewMapNumber = wx.TextCtrl(self, id=1000, pos=(20,20), size = (50,20), style = wx.TE_CENTER|wx.TE_NOHIDESEL|wx.TE_PROCESS_ENTER)
        vsizer.Add(self.tbxNewMapNumber)
        
    def coord_listener(self, message):
        newmapnum = message
        self.tbxNewMapNumber.SetValue(newmapnum)
        self.tbxNewMapNumber.Refresh()


class GMDash(wx.App):
    def OnInit(self):
        self.mainframe = MainFrame(parent = None, title = "Dashboard")
        self.mainframe.Show()
        return True

app = GMDash()
app.MainLoop()

“”“

EN

回答 1

Stack Overflow用户

发布于 2021-05-27 17:16:39

在对sendmessage的调用中使用命名参数,您将需要注册发送消息的侦听器before,而不是像您当前正在做的那样。

如下所示:

代码语言:javascript
复制
from pubsub import pub
import wx

class MainFrame (wx.Frame):
    def __init__(self, parent, title):
        super(MainFrame, self).__init__(parent, title = title, size = (200,200))
        self.panel = MainPanel(self)

class CoordFrame (wx.Frame):
    def __init__(self, parent, title):
        super(CoordFrame, self).__init__(parent, title = title, size = (200,200))
        self.panel = CoordPanel(self)


class MainPanel(wx.Panel):
    def __init__(self, parent):
        super(MainPanel, self).__init__(parent)
        vsizer = wx.BoxSizer(wx.VERTICAL)
    
        self.tbxNewMap = wx.TextCtrl(self, id=1001, pos=(20,20), size = (50,20) ,style = wx.TE_CENTER|wx.TE_NOHIDESEL|wx.TE_PROCESS_ENTER)
        vsizer.Add(self.tbxNewMap)

        self.btnEnterNewMap = wx.Button(self, id=1002, label = "New Data", pos = (20,80), size = (80,40))
        vsizer.Add(self.btnEnterNewMap,0,wx.EXPAND)
        self.Bind(wx.EVT_BUTTON, self.onButtonNewMap, id=1002)
    #Register the subscrption *before* sending the message
        self.coordframe = CoordFrame(None,"Entry")

    def onButtonNewMap(self,event):
        temp = self.tbxNewMap.GetValue()
        pub.sendMessage("coord_listener", message=temp)
        #coordframe = CoordFrame(None,"Entry")
        self.coordframe.Show()

class CoordPanel(wx.Panel):
    def __init__(self, parent):
        super(CoordPanel, self).__init__(parent)
        vsizer = wx.BoxSizer(wx.VERTICAL)
        pub.subscribe(self.coord_listener, "coord_listener")

        self.tbxNewMapNumber = wx.TextCtrl(self, id=1000, pos=(20,20), size = (50,20), style = wx.TE_CENTER|wx.TE_NOHIDESEL|wx.TE_PROCESS_ENTER)
        vsizer.Add(self.tbxNewMapNumber)
        
    def coord_listener(self, message):
        print(message)
        newmapnum = message
        self.tbxNewMapNumber.SetValue(newmapnum)
        self.tbxNewMapNumber.Refresh()


class GMDash(wx.App):
    def OnInit(self):
        self.mainframe = MainFrame(parent = None, title = "Dashboard")
        self.mainframe.Show()
        return True

app = GMDash()
app.MainLoop()

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67712782

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档