在wxPython中关闭和打开框架

0 投票
2 回答
1996 浏览
提问于 2025-04-15 11:42

我正在写一个非常简单的客户端/服务器应用程序,借此机会开始学习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

mainWindowhandleServerSignon 这个方法里的一个局部变量。虽然我只是猜测,但我觉得这个变量可能会在 handleServerSignon 方法执行完后就被垃圾回收了。

2

我建议你先让主窗口显示出来,然后在它上面弹出一个登录对话框。

如果你不想这样做,我建议你创建两个独立的窗口,并让你的应用程序监听登录窗口的关闭事件。在这个事件处理程序中处理登录,然后再显示主窗口。简单来说,你不想在事件处理程序里创建主窗口,因为一旦你离开这个函数,作用域就会消失,垃圾回收器会试图把你的窗口给清除掉。

最后,你应该考虑只调用一次 getCode(),然后把结果保存起来用于比较。因为你的 if 语句和 elif 语句都调用了 getCode(),这可能会导致它们返回不同的结果。

撰写回答