【问题标题】:Cannot close wxPython window on Mac无法在 Mac 上关闭 wxPython 窗口
【发布时间】:2014-09-23 23:47:43
【问题描述】:

当我尝试将 vtk 集成到 wxPython gui 中时,我一直在努力解决我现在意识到的几种不同的 python 崩溃和/或应用程序挂起。我有一个单独的 open question 处理一个独立的 vtk 示例。我还发现了在关闭窗口过程中正确删除 vtk 对象的一类问题。然而,在追逐这些问题时,我发现我什至无法干净地关闭一个简单的 wx.Frame!

以下简单示例(作为对其他人的unrelated question on closing wxPython 的回答的一部分提供)无法在我的 Mac 上关闭(在 Mac OSX 10.9.4 上运行 Enthought Canopy 1.4.1.1975)但在我的 Windows VM 上运行并干净地关闭(运行相同的 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 位 | (默认,2014 年 6 月 4 日, 16:42:26) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type “帮助”、“版权”、“致谢”或“许可”以获取更多信息。

[python 提示] execfile('simpleClose.py')

关闭

[python 提示] execfile('simpleClose.py')

回溯(最近一次通话最后一次):
文件“[stdin]”,第 1 行,在 [module]
文件“simpleClose.py”,第 25 行,在 [module] frame = MyFrame() 文件“simpleClose.py”,第 10 行,在 init wx.Frame.init(self, None, title="Close Me") > File "/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 提示符]$

【问题讨论】:

  • 什么是“python 内核崩溃”?您的意思是您的 Python 脚本使您的操作系统内核崩溃,迫使您重新启动计算机?或者您的意思是 IPython 意义上的内核,并且您正在制作 IPython 段错误使用的解释器?还是……?
  • 澄清一下,我提到的“python 崩溃”主要是在我一直在追逐(并提到)的其他问题的背景下。引用示例的观察行为只是窗口没有消失。也就是说,我编辑了我的问题以澄清并提供了几个额外的测试用例,其中一个确实包含段错误。为了尝试明确回答您的问题,我认为我的意思是 iPython 意义上的,但老实说,我并不完全确定。谢谢。

标签: python macos wxpython enthought


【解决方案1】:

这是一个完全不令人满意的答案,因为我还不明白从根本上发生了什么,但我提出它是因为它确实解决了我的问题(目前)。我仍然希望其他人会发布更好的答案,以阐明潜在问题。

与 Jonathan March 提出的解决方案直接冲突,我在帖子顶部引用了我的单独 open question,当我在 Canopy 首选项下重新启用 PyLab 时,这个问题就消失了。在我注意到我的所有 matplotlib 绘图不再可交互之后,我尝试了这个(旋转的沙滩球光标从未消失,我无法缩放、旋转等)。重新启用 PyLab 也解决了绘图问题。我目前正在为 PyLab 使用 QT 后端,但尚未尝试使用任何其他可用的后端。

【讨论】:

    猜你喜欢
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多