无法关闭Mac上的wxPython窗口

1 投票
1 回答
722 浏览
提问于 2025-04-18 15:33

我最近在尝试把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 个回答

2

这个回答让我觉得不太满意,因为我还不太明白根本发生了什么。不过我还是把它放上来,因为它解决了我的问题(暂时)。我希望其他人能提供一个更好的答案,能解释一下背后的原因。

这和Jonathan March在我之前提到的问题中提出的解决方案是直接冲突的。这个问题在我重新启用Canopy偏好设置中的PyLab后就解决了。我注意到我的所有matplotlib图表都无法互动(那个转动的沙滩球光标一直存在,我无法缩放、旋转等等)。重新启用PyLab也解决了图表的问题。目前我在使用PyLab的QT后端,还没有尝试其他可用的后端。

撰写回答