关闭GUI时挂起问题

时间:2014-07-03 15:03:12

标签: wxpython

当我关闭我开发的GUI时,终端中有一些挂起(在Mac OS X Mavericks上),而不是终端上的几乎瞬时终止,从终端用户端关闭GUI是预期的。当它在终端中关闭时,将显示以下消息:

Checking Connection to Server...
Connection Failed!
Exception in thread Thread-3:
Traceback (most recent call last):
  File       "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 810, in __bootstrap_inner
    self.run()
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/threading.py", line 1082, in run
    self.function(*self.args, **self.kwargs)
  File "sigd_tool_v20.py", line 1751, in CheckConnection
    self.connect.SetLabel("Not Connected!")
  File "/usr/local/lib/wxPython-3.0.0.0/lib/python2.7/site-packages/wx-3.0-osx_cocoa/wx/_core.py", line 16712, in __getattr__
raise PyDeadObjectError(self.attrStr % self._name)
PyDeadObjectError: The C++ part of the TestPanel object has been deleted, attribute access no longer allowed.

我在GUI中添加了一个名为CheckConnection的函数,它允许最终用户在使用GUI时查看它们是否仍然连接到我们的服务器。我怀疑这是由于不正确的线程,主要是因为终端指示。我不明白为什么我会得到PyDeadObjectError。对我来说有什么想法?提前谢谢!

1 个答案:

答案 0 :(得分:1)

线程可能直接访问GUI,这是你绝对不应该做的事情。您只能使用wxPython的线程安全方法访问GUI:wx.CallAfter和wx.PostEvent。

PyDeadObjectError意味着某个东西(可能是线程)在它已经被销毁之后试图访问它。

关闭应用程序时,需要在关闭框架之前结束线程。这意味着你需要调用线程的 join()方法或者以其他方式杀死它。完成后,您可以正常关闭框架。