Python 模态对话框冻结整个应用程序

Python 模态对话框冻结整个应用程序,python,matplotlib,wxpython,Python,Matplotlib,Wxpython,我在ubuntu机器上使用wxpython和matplotlib后端。我想将matplotlib画布连接到弹出wxpython模式对话框的按钮按下事件。当模式对话框弹出时,整个应用程序将被冻结。windows计算机上不会出现此问题。下面是一个典型的重现问题的片段 import wx from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg from matplotlib.figure import Figure clas

我在ubuntu机器上使用wxpython和matplotlib后端。我想将matplotlib画布连接到弹出wxpython模式对话框的按钮按下事件。当模式对话框弹出时,整个应用程序将被冻结。windows计算机上不会出现此问题。下面是一个典型的重现问题的片段

import wx

from matplotlib.backends.backend_wxagg import FigureCanvasWxAgg
from matplotlib.figure import Figure


class SettingDialog(wx.Dialog):

    def __init__(self, parent=None):

        wx.Dialog.__init__(self, parent, wx.ID_ANY, title="Modal dialog")


class PlotterFrame(wx.Frame):

    def __init__(self, parent, title="Frame with matplotlib canvas"):

        wx.Frame.__init__(self, parent, wx.ID_ANY, title)

        self.figure = Figure(figsize=(5,4), dpi=None)
        self.canvas = FigureCanvasWxAgg(self, -1, self.figure )
        self.canvas.mpl_connect("button_press_event", self.on_click)


    def on_click(self, event=None):
        d = SettingDialog(self)
        d.ShowModal()
        d.Destroy()  

if __name__ == "__main__":
    app = wx.App(False)
    f = PlotterFrame(None)
    f.Show()
    app.MainLoop()
你知道我的代码有什么问题吗


PS0:问题是对话框窗口也被冻结了,就像桌面上的所有应用程序一样,不再做出反应。逃脱的唯一方法是使用键盘切换到另一个桌面

PS1:有一个非常常见的例子,比如 这个问题也出现了,我的结论是,对于以下libs版本,这个问题是linux(这里是ubuntu 12.04)上的一个bug: wx.版本:“2.8.12.1”
matplotlib.版本:“1.1.1rc”

模式对话框的全部要点是,它在对话框处于模式状态时冻结应用程序。如果不希望应用程序冻结,则不要以模式显示对话框。

我在几个不同的Linux系统上也遇到了这个问题。所提到的各种资源中似乎没有一种描述与此问题完全相同。经过调查,在Matplotlib FigureCanvas中触发鼠标释放事件之前,尝试显示模式对话框时,似乎有什么东西被锁定了

一旦我意识到这一点,解决方案就非常简单。您的事件处理程序应为:

def on_click(self, event=None):
    try:
        event.guiEvent.GetEventObject().ReleaseMouse()
    except:
        pass
    d = SettingDialog(self)
    d.ShowModal()
    d.Destroy()
可能使代码复杂化的一个问题是并非所有matplotlib事件都具有相同的结构。因此,如果这是一个“pick_事件”处理程序,您将改为执行此操作

event.mouseevent.guiEvent.GetEventObject().ReleaseMouse()

检查matplotlib事件传递到哪些事件类型的键。

这不是模式对话(阻止程序的其余部分)的要点吗?问题是对话框窗口也被冻结,就像桌面上的所有应用程序一样,不再做出反应。唯一的逃生方法是使用键盘切换到另一个桌面…问题是对话框窗口也被冻结,就像桌面上的所有应用程序一样,不再做出反应。逃脱的唯一方法是使用键盘切换另一个桌面…matplotlib和wx之间可能存在一些我不知道的奇怪交互。您可能应该询问wxPython和matplotlib邮件列表。