无法关闭Mac上的wxPython窗口
我最近在尝试把vtk整合进wxPython的图形界面时,遇到了几个不同的python崩溃和应用程序卡住的问题。我还有一个关于独立vtk示例的开放问题。我还发现了一些问题,主要是关于在关闭窗口时如何正确删除vtk对象。不过,在解决这些问题的过程中,我发现我连一个简单的wx.Frame都无法正常关闭!
下面这个简单的例子(是对别人不相关问题的回答的一部分)在我的Mac上无法关闭(我在Mac OSX 10.9.4上运行Enthought Canopy 1.4.1.1975),但在我的Windows虚拟机上(同样的Canopy版本)可以正常运行并关闭。
具体来说,点击红色的“关闭”点或者“关闭”wx.Button后,控制权返回到Canopy中的python提示符,但窗口并没有消失。点击“关闭”按钮时,我看到打印语句出现,说明控制权通过了onClose函数。在这两种情况下,重启python内核(在Canopy菜单栏中选择运行->“重启内核...”)可以让窗口消失。
由于之前提到的问题,Pylab已经被禁用。
import wx
########################################################################
class MyFrame(wx.Frame):
""""""
#----------------------------------------------------------------------
def __init__(self):
"""Constructor"""
wx.Frame.__init__(self, None, title="Close Me")
panel = wx.Panel(self)
closeBtn = wx.Button(panel, label="Close")
closeBtn.Bind(wx.EVT_BUTTON, self.onClose)
#----------------------------------------------------------------------
def onClose(self, event):
""""""
print 'onClose'
self.Close()
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
frame.Show()
app.MainLoop()
编辑:
我尝试从命令行运行上面的脚本(而不是通过Canopy的IDE),观察到以下情况:
[非交互模式] 在命令行输入“python simpleClose.py”,窗口正常启动并关闭,看起来一切正常。
[交互模式] 在命令行输入“python”,然后在交互式python提示符下输入“execfile('simpleClose.py')”,窗口启动但不关闭。按下关闭按钮后,控制权返回到交互式python提示符(我可以继续执行其他命令),但窗口依然保持打开状态。输入“exit()”关闭交互式python提示符后,窗口也消失了。如果我尝试重新启动测试应用程序,就会出现如下的段错误:
[mac提示符]$ python
Enthought Canopy Python 2.7.6 | 64-bit | (default, Jun 4 2014, 16:42:26) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin 类型 "help", "copyright", "credits" 或 "license" 获取更多信息。
[python提示符] execfile('simpleClose.py')
onClose
[python提示符] execfile('simpleClose.py')
追踪(最近的调用最后):
文件 "[stdin]", 第 1 行, 在 [模块]
文件 "simpleClose.py", 第 25 行, 在 [模块] frame = MyFrame() 文件 "simpleClose.py", 第 10 行, 在 init wx.Frame.init(self, None, title="Close Me") > 文件 "/Users/tanner/Library/Enthought/Canopy_64bit/User/lib/python2.7/site-packages/wx/_windows.py", 第 576 行, 在 init windows.Frame_swiginit(self,windows.new_Frame(*args, **kwargs)) wx._core.PyNoAppError: wx.App对象必须先创建![python提示符] exit()
段错误: 11
[mac提示符]$
1 个回答
这个回答让我觉得不太满意,因为我还不太明白根本发生了什么。不过我还是把它放上来,因为它解决了我的问题(暂时)。我希望其他人能提供一个更好的答案,能解释一下背后的原因。
这和Jonathan March在我之前提到的问题中提出的解决方案是直接冲突的。这个问题在我重新启用Canopy偏好设置中的PyLab后就解决了。我注意到我的所有matplotlib图表都无法互动(那个转动的沙滩球光标一直存在,我无法缩放、旋转等等)。重新启用PyLab也解决了图表的问题。目前我在使用PyLab的QT后端,还没有尝试其他可用的后端。