Wxpython在两个python文件之间切换帧

时间:2013-11-12 16:48:49

标签: python wxpython

我有两个py文件,每个文件都有自己的框架,使用wxPython,MainWindow和RecWindow。 MainWindow使用关键字“recovery”包含RecWindow python文件。

MainWindow代码:

class MainWindow(wx.Frame):
def __init__(self,parent,id,title):
    wx.Frame.__init__(self, parent, wx.ID_ANY,title,pos=(500,200), size = (650,500), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
    self.Bind(wx.EVT_CLOSE,self.OnExit)
    self.SetIcon(wx.Icon('etc\icons\download.ico', wx.BITMAP_TYPE_ICO))
    panel = wx.Panel(self)

RecWindow代码:

class RecWindow(wx.Frame):
def __init__(self,parent,id,title):
    wx.Frame.__init__(self, parent, wx.ID_ANY,title,pos=(400,200), size = (700,600), style = wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)
    self.SetIcon(wx.Icon('etc\icons\download.ico', wx.BITMAP_TYPE_ICO))
    self.count = 0

当我点击MainWindow中的一个按钮时,它会隐藏MainWindow创建一个RecWindow实例,如下所示;

def OpenRec(self,event):#this will be used to open the next frame
    OR = recovery(None,-1,"RAVE")
    OR.Show(True)
    MainWindow.Hide()

现在,我不确定的是,一旦我关闭RecWindow,我将如何返回MainWindow。 RecWindow有一个取消和完成按钮,它们都映射到self.close()函数。那么我如何让MainWindow再次展示自己?

2 个答案:

答案 0 :(得分:0)

使用pubsub向主窗口发送消息,告诉它再次显示自己。我实际上有一个如何做到这一点的例子:

请注意,本教程使用的是wxPython 2.8中提供的稍旧的API。如果你正在使用wxPython 2.9,那么你将不得不使用我在本文中详述的稍微不同的API:

答案 1 :(得分:0)

当您创建RecWindow的实例时,请在main_window上保留对它的引用并绑定到它的close事件。

在main_window的close处理程序中,检查窗口是否为RecWindow。

如果是,请清除对它的引用并显示main_window。

Elif关闭的窗口是main_window执行任何所需的代码。

最后调用event.Skip()以便窗口被破坏。

import wx


class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, (500, 200), (650, 500),
            wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)

        panel = wx.Panel(self)
        button = wx.Button(panel, wx.ID_OPEN)

        panel.sizer = wx.BoxSizer(wx.VERTICAL)
        panel.sizer.Add(button, 0, wx.ALL, 7)
        panel.SetSizer(panel.sizer)

        button.Bind(wx.EVT_BUTTON, self.on_button)
        self.Bind(wx.EVT_CLOSE, self.on_close)

        self.rec_window = None

    def on_button(self, event):
        rec_window = RecWindow(self, 'Rec window')
        rec_window.Show()
        self.Hide()
        rec_window.Bind(wx.EVT_CLOSE, self.on_close)
        self.rec_window = rec_window

    def on_close(self, event):
        closed_window = event.EventObject
        if closed_window == self.rec_window:
            self.rec_window = None
            self.Show()
        elif closed_window == self:
            print 'Carry out your code for when Main window closes'
        event.Skip()


class RecWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, (400, 200), (700, 600),
            wx.DEFAULT_FRAME_STYLE | wx.NO_FULL_REPAINT_ON_RESIZE)


app = wx.App(False)
main_window = MainWindow(None, 'Main window')
main_window.Show()
app.MainLoop()