将消息从一个类发送到另一个类

时间:2015-12-23 22:27:53

标签: python class wxpython

问题:我有一个框架(FirstFrame类),它有一个调用另一个框架(SecondFrame类)的按钮。当我点击SecondFrame中的按钮时,我希望此框架关闭并向{{1}发送一条消息('我在第一帧',见下文) }。

到目前为止,这是我的代码:

FirstFrame

我只是不知道如何连接这两个类。也就是说,在第二帧中单击按钮后,如何与调用它的第一帧进行通信。有什么建议?点击import wx class FirstFrame(wx.Frame): def __init__(self, parent, title): wx.Frame.__init__(self, None, title="First Frame", size=(400,400)) self.UI() self.Centre() self.Show() def UI(self): self.panel1 = wx.Panel(self, -1) self.sizer = wx.BoxSizer() self.sizer.Add(self.panel1, 1, flag=wx.EXPAND) b = wx.Button(self.panel1, label='second window', size=(100,100), pos=(100,100)) b.Bind(wx.EVT_BUTTON, self.OnB) self.SetSizer(self.sizer) def OnB(self, event): frame = SecondFrame() frame.Show() class SecondFrame(wx.Frame): def __init__(self): """Constructor""" wx.Frame.__init__(self, None, title="Second Frame") panel = wx.Panel(self) txt = wx.StaticText(panel, label="I'm the second frame!") self.button = wx.Button(panel, -1, "Close window and send message", pos = (100,100)) self.button.Bind(wx.EVT_BUTTON, self.onClose) def onClose(self,event): self.Close() #---------------------------------------------------------------------- app = wx.App(False) FirstFrame(None, title='') app.MainLoop() 上的按钮后,我想获得的内容与此类似: enter image description here

提前致谢。

1 个答案:

答案 0 :(得分:3)

  

也就是说,单击第二帧中的按钮后,如何操作   与调用它的第一帧通信。有什么建议吗?

创建第二帧时,请向其发送self

frame = SecondFrame(self)  #Inside the first Frame, self is the first Frame

或等同地:

first_frame = self
frame = SecondFrame(first_frame)

在第二个Frame的构造函数中执行此操作:

class SecondFrame(wx.Frame):

    def __init__(self, first_frame):
        """Constructor"""
        wx.Frame.__init__(self, None, title="Second Frame")
        self.first_frame = first_frame

然后,在第二个Frame的onclick处理程序中,您可以执行以下操作:

def onClose(self,event):
    self.first_frame.do_something("I'm the first frame")
    self.Close()

在第一帧中,你可以这样做:

class FirstFrame(wx.Frame):
    ...
    ...
    def do_something(self, msg):
        self.msg = msg  #Save the message
        print(msg)      #Do something else with the message....

或者,在您的特定情况下:

    def do_something(self, msg):
        wx.StaticText(self.panel1, label="I'm the first frame")

请注意,在第一个Frame构造函数中:

def __init__(self, parent, title):
        wx.Frame.__init__(self, None, title="First Frame", size=(400,400))

您不使用父参数或title参数变量,因此为这些变量指定参数不会产生任何结果:

FirstFrame(None, title='')

标题不会是空白,它将是" First Frame"。你想做这样的事情:

class FirstFrame(wx.Frame):

    def __init__(self, the_title="First Frame", the_parent=None):
        wx.Frame.__init__(
                self, 
                the_parent, 
                title=the_title, 
                size=(400,400)
        )
        self.UI()
        self.Centre()
        self.Show()

然后,如果你想使用默认值,你可以像这样调用第一个Frame构造函数:

app = wx.App(False)
FirstFrame()
app.MainLoop()

而且,如果你想使用另一个标题,你可以写:

app = wx.App(False)
FirstFrame("Testing")
app.MainLoop()