2013-05-29 2 views
1

우분투 컴퓨터에서 matplotlib 백엔드와 함께 wxpython을 사용합니다. matplotlib 캔버스를 wxpython 모달 대화 상자를 팝업하는 button_press_event에 연결하고 싶습니다. 모달 대화 상자가 나타나면 전체 응용 프로그램이 정지됩니다. 이 문제는 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을 사용하여 다른 바탕 화면으로 전환하는 것입니다 : 나는 그래서 결론은 매우 일반적인 예와 http://eli.thegreenplace.net/files/prog_code/wx_mpl_bars.py.txt 같은 문제가 나타날이 문제는 리눅스에서 버그입니다 (여기 우분투 12.04를) 다음 libs 버전 : wx. 버전 : '2.8.12.1' matplotlib. 버전 '1.1.1rc은'

+0

은 모달 대화 상자의 요점이 아닙니다 (프로그램의 나머지 부분을 차단하기 위해)? – tacaswell

+0

문제는 더 이상 반응하지 않는 데스크톱의 모든 응용 프로그램처럼 대화 상자 창이 고정되어 있다는 것입니다. 탈출하는 유일한 방법은 키보드를 사용하여 다른 바탕 화면으로 전환하는 것입니다. –

답변

1

모달 대화의 요점 대화 상자가 모달 상태에있는 동안이 응용 프로그램을 정지한다는 것입니다. 응용 프로그램을 정지시키지 않으려면 모달로 대화 상자를 표시하지 마십시오.

+0

문제는 더 이상 반응하지 않는 바탕 화면의 모든 응용 프로그램처럼 대화 상자 창이 고정되어 있다는 것입니다. 탈출하는 유일한 방법은 키보드를 사용하여 다른 바탕 화면을 전환하는 것입니다 ... –

+0

matplotlib와 wx 사이에 이상한 상호 작용이있을 수 있습니다. 아마 wxPython과 matplotlib 메일 링리스트에서 물어볼 것입니다. –

1

다른 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'핸들러 있었다 그렇다면, 당신은 대신하는 이벤트를하기 matplotlib 이벤트 유형에 전달하는 키

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

확인 http://matplotlib.org/users/event_handling.html 할 것입니다.

관련 문제