我正在编写一个非常简单的客户端/服务器应用程序作为开始在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)'失败。
非常感谢任何帮助!
沃克
答案 0 :(得分:1)
我会让你的主框架出现,然后在顶部显示一个模态登录对话框。
如果您不想这样做,我建议您创建两个单独的框架,并让您的应用程序在登录框架上侦听关闭事件。处理该事件处理程序中的登录,然后让它显示主窗口。基本上,您不希望在事件处理程序中实例化主窗口,因为一旦您离开该函数,范围就会丢失,垃圾收集器将尝试删除您的框架。
最后,您应该考虑调用getCode()
一次并缓存结果以进行比较。由于您的if语句和 elif语句都会调用getCode()
,因此它可能会产生不同的结果。
答案 1 :(得分:0)
mainWindow
是handleServerSignon
的局部变量。这是一个猜测,但我认为一旦handleServerSignon
方法返回,它就可能被垃圾收集。