+ -
当前位置:首页 → 问答吧 → wxPython 出现Paint事件死循环问题求解

wxPython 出现Paint事件死循环问题求解

时间:2011-01-04

来源:互联网

这个问题很奇怪,开始运行程序是不会死的,但是吧窗口最小化,或者盖住窗口然后又显示,就会出现一直相应Paint事件的情况。
不知道是不是OnPaint响应函数的代码里面有什么因素导致了系统发送Paint事件从而导致死循环,有经验的给指导一下,谢谢!

Python code

import wx

class CurveArea(wx.Window):
    def __init__(self,parent,points,id = wx.ID_ANY,pos = wx.DefaultPosition,
                 size = wx.DefaultSize,style = 0,name = "CurveArea"):
        wx.Window.__init__(self,parent,id,pos,size,style,name)
        self.step = 80
        self.curve = []
        self.points = points
        self.Bind(wx.EVT_PAINT, self.OnPaint)
        
    def _DoDraw(self,dc):
        def _DrawLines(lst):
            dc.DrawLines(lst)
            print lst
            num = len(lst)
            if 2 == num:
                x = int((lst[0][0] + lst[1][0]) / 2)
                y = int((lst[0][1] + lst[1][1]) / 2)
                self.curve.append((x,y))
            else:
                newlst = []
                for i in range(num - 1):
                    x = (lst[i + 1][0] - lst[i][0]) * self.step / 200 + lst[i][0]
                    y = (lst[i + 1][1] - lst[i][1]) * self.step / 200 + lst[i][1]
                    newlst.append((x,y))
                    
                _DrawLines(newlst)
                
        dc.SetPen(wx.Pen("BLUE"))
        if 2 < len(self.points):
            _DrawLines(self.points)
        
    def OnPaint(self,evt):
        dc = wx.PaintDC(self)
        self._DoDraw(dc)
        
if __name__ == '__main__':
    app = wx.App(False)
    
    frame = wx.Frame(None,size = (800,600))
    ca = CurveArea(frame,[(50,500),(50,50),(500,50),(500,500)])
    frame.Show(True)
    
    app.MainLoop()

作者: WizardOz   发布时间: 2011-01-04

您老用的 wx 啥版本呀 ... 貌似 VZ 说这是因为没有在处理 EVT_PAINT 的窗口中事先创建 wxPaintDC 造成的 windoze 下无休止的 WM_PAINT 消息流蓄积, 可能有望在 2.9.1 正式版中得到优雅的解决处置 ...

引用楼主 wizardoz 的回复:
这个问题很奇怪,开始运行程序是不会死的,但是吧窗口最小化,或者盖住窗口然后又显示,就会出现一直相应Paint事件的情况。
不知道是不是OnPaint响应函数的代码里面有什么因素导致了系统发送Paint事件从而导致死循环,有经验的给指导一下,谢谢!

Python code

import wx

class CurveArea(wx.Window):
def __init__(se……

作者: shyokou   发布时间: 2011-01-05