wxpython绘制事件无限循环

wxpython绘制事件无限循环,wxpython,paint,infinite-loop,Wxpython,Paint,Infinite Loop,我想在wxpython的面板上画一些简单的图(线、圆等)。我修改了在某处找到的示例代码。它工作得很好,但直到我最小化窗口或切换到另一个窗口并返回。然后它开始在无限循环中重新绘制 这会发生吗?如果没有,有没有办法防止无限循环 我发现的一个解决方案是使用wx.Timer,但它只是以可调的间隔产生相同的循环 import math import wx class DrawPanel(wx.Frame): def __init__(self,parent): wx.Fram

我想在wxpython的面板上画一些简单的图(线、圆等)。我修改了在某处找到的示例代码。它工作得很好,但直到我最小化窗口或切换到另一个窗口并返回。然后它开始在无限循环中重新绘制

这会发生吗?如果没有,有没有办法防止无限循环

我发现的一个解决方案是使用wx.Timer,但它只是以可调的间隔产生相同的循环

import math

import wx

class DrawPanel(wx.Frame):

    def __init__(self,parent):
        wx.Frame.__init__(self,parent,title='Drawing on panel')
        self.Bind(wx.EVT_PAINT,self.OnDraw)

    def OnDraw(self,event=None):
        self.dc = wx.PaintDC(self)
        self.dc.Clear()
        self.dc.SetPen(wx.Pen(wx.BLACK,1.5))
        i0 = 1
        for i in range(2,1000,1):
            i = i/10.0
            self.dc.DrawLine(i0,200*math.sin(i0/10)+200,
                        i,200*math.sin(i/10)+200)
            i0 = i

if __name__ == '__main__':
    aplication = wx.App()
    ram = DrawPanel(parent=None)
    ram.Show()
    aplication.MainLoop()

在函数
OnDraw
中,创建局部变量
dc
,而不是使用属性(
dc
而不是
self.dc
)。

我创建了类的dc属性,以便可以通过多种方法访问它。如果它不能是属性,我尝试创建多个相互重叠的图形,结果是相同的。我想我只需要用一种方法绘制所有的图形。您可以始终向这些方法添加一个参数
dc
,然后从
OnDraw
:)dc应该只在EVT_PAINT处理程序中创建,所以您确实不应该手动调用方法
OnPaint
(为什么是默认参数?)。只是尝试了一下,但它做了同样的无限循环。也许我可以使用多种方法来准备绘图,但是用一种方法来绘制实际的绘图。谢谢你的帮助我不想手动调用这个方法,只是当我想画更复杂的东西时,有一个方法太笨拙了。默认情况下,我猜您的意思是event=None-我不知道它为什么会在那里(对于那个:),我也不知道。是的,这就是我的意思:)。您可以在
dc.Clear
之后调用一些方法来拆分图形,例如
self.drawFirst(dc)
然后
self.drawSecond(dc)
。其中
def drawFirst(self,dc)
仅绘制原始内容(设置笔,在循环中绘制)和
drawSecond
其他内容。