在wxPython中关闭和打开框架
我正在写一个非常简单的客户端/服务器应用程序,借此机会开始学习Python中的网络和图形用户界面编程。目前,我在从登录界面切换到应用程序的主界面时遇到了问题。
登录界面是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: 断言 `(((long) (dpy->last_request_read) - (long) (dpy->request)) <= 0)' 失败。
非常感谢任何帮助!
Walker
2 个回答
0
mainWindow
是 handleServerSignon
这个方法里的一个局部变量。虽然我只是猜测,但我觉得这个变量可能会在 handleServerSignon
方法执行完后就被垃圾回收了。
2
我建议你先让主窗口显示出来,然后在它上面弹出一个登录对话框。
如果你不想这样做,我建议你创建两个独立的窗口,并让你的应用程序监听登录窗口的关闭事件。在这个事件处理程序中处理登录,然后再显示主窗口。简单来说,你不想在事件处理程序里创建主窗口,因为一旦你离开这个函数,作用域就会消失,垃圾回收器会试图把你的窗口给清除掉。
最后,你应该考虑只调用一次 getCode()
,然后把结果保存起来用于比较。因为你的 if 语句和 elif 语句都调用了 getCode()
,这可能会导致它们返回不同的结果。