2013-05-29 6 views
1

Я использую wxpython в целом с backplan matplotlib на машине ubuntu. Я хотел бы связать свою полосу matplotlib с кнопкой button_press_event, которая выведет модальный диалог 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: с очень распространенным примером, как http://eli.thegreenplace.net/files/prog_code/wx_mpl_bars.py.txt проблема также появляется, я делаю вывод, так что эта проблемой является ошибкой на Linux (здесь Ubuntu 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» обработчик, вы бы вместо того, чтобы сделать

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

Проверьте http://matplotlib.org/users/event_handling.html для ключа, какие типы событий передаются в, с помощью которого Matplotlib события.

Смежные вопросы