关闭和打开wxPython中的框架

时间:2009-05-19 23:02:13

标签: python user-interface network-programming wxpython

我正在编写一个非常简单的客户端/服务器应用程序作为开始在python中学习网络/ gui编程的借口。目前我仍然坚持从登录框架转换到应用程序的主框架。

登录框架是wx.Frame的子类,基本上我只想关闭它并在收到服务器确认时打开主框架:

def handleServerSignon(self, msg):
    if msg.getCode() == net.message.HANDLE_IN_USE:
        self.status.SetStatusText('Handle already in use')
    elif msg.getCode() == net.message.SIGNON_SUCCESSFUL:
        self.Close()
        mainWindow = wx.Frame(None, wx.ID_ANY, 'main window', wx.DefaultPosition, \
                              (640, 480))

        mainWindow.Show(True)

我甚至无法通过这个来提供一致的错误消息...有时它会起作用,有时它会崩溃:

  

python:../../ src / xcb_io.c:242:   process_responses:断言`(((长)   (dpy-> last_request_read) - (长)   (dpy->请求))< = 0)'失败。

非常感谢任何帮助!

沃克

2 个答案:

答案 0 :(得分:1)

我会让你的主框架出现,然后在顶部显示一个模态登录对话框。

如果您不想这样做,我建议您创建两个单独的框架,并让您的应用程序在登录框架上侦听关闭事件。处理该事件处理程序中的登录,然后让它显示主窗口。基本上,您不希望在事件处理程序中实例化主窗口,因为一旦您离开该函数,范围就会丢失,垃圾收集器将尝试删除您的框架。

最后,您应该考虑调用getCode()一次并缓存结果以进行比较。由于您的if语句 elif语句都会调用getCode(),因此它可能会产生不同的结果。

答案 1 :(得分:0)

mainWindowhandleServerSignon的局部变量。这是一个猜测,但我认为一旦handleServerSignon方法返回,它就可能被垃圾收集。