wxpython绘制事件无限循环
我想在wxpython的面板上画一些简单的图(线、圆等)。我修改了在某处找到的示例代码。它工作得很好,但直到我最小化窗口或切换到另一个窗口并返回。然后它开始在无限循环中重新绘制 这会发生吗?如果没有,有没有办法防止无限循环 我发现的一个解决方案是使用wx.Timer,但它只是以可调的间隔产生相同的循环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
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
其他内容。