使用Ctrl-W关闭wxpython中的pyplot窗口会导致分段错误

时间:2014-10-14 14:21:51

标签: python matplotlib wxpython exec

我创建的编程/建模环境的图形用户界面在很大程度上取决于从wxwidgets gui执行任意python代码。下面是GUI如何让用户创建matplotlib图的最小但典型的例子:

更新:事实证明,该bug不依赖于正在执行的脚本!见下文

import wx
script = """
import matplotlib.pyplot as pl
import numpy as np

x = np.linspace(0, 1, 100)
y = x ** 1.4
pl.figure()
pl.plot(x, y)
pl.show()
"""
class Main(wx.Frame):
    def __init__(self):
        super(Main, self).__init__(None)
        button = wx.Button(self, wx.ID_ANY, 'Run')
        button.Bind(wx.EVT_BUTTON, self.action_run)
        self.Show()
    def action_run(self, e=None):
        exec(script)
if __name__ == '__main__':
    app = wx.App(False)
    frame = Main()
    app.MainLoop()

通常,GUI只会显示一个运行按钮,而且脚本不是静态的,而是由用户输入/从文件中读取。它工作正常,在Linux,Mac和Windows上但是......

如果您使用鼠标关闭图形,一切正常。 如果您使用Ctrl-W关闭图形,则应用程序会因段错而崩溃。

有没有人知道为什么会发生这种情况或如何调试?

更新:以下是涉及的版本

>>> wx.version()
'wx.2.8.12.0 (gtk2-unicode)'
>>> mpl.__version__
'1.3.1'

段错误发生在linux(Fedora 20,Gnome 3.10.2)

版本:

  • Windows 7,Matplotlib 1.3.1,wxPython 2.8.12.1:无错误
  • Fedora 20,Gnome 3.10.2,Matplotlib 1.3.1,wxPython 2.8.12.0: bug
  • Fedora 20,Gnome 3.10.2,Matplotlib 1.4.2,wxPython 2.8.12.0: bug

更新2:

没有脚本执行也会发生!

#!/usr/bin/env python
import wx
import matplotlib
matplotlib.use('wxAgg')
import matplotlib.pyplot as pl
class Main(wx.Frame):
    def __init__(self):
        super(Main, self).__init__(None)
        button = wx.Button(self, wx.ID_ANY, 'Run')
        button.Bind(wx.EVT_BUTTON, self.action_run)
        self.Show()
    def action_run(self, e=None):
        pl.figure()
        pl.plot([1,2,3,4,5], [3,1,2,5,4])
        pl.show()
if __name__ == '__main__':
    app = wx.App(False)
    frame = Main()
    app.MainLoop()

1 个答案:

答案 0 :(得分:0)