首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >改进wxPython OnPaint

改进wxPython OnPaint
EN

Stack Overflow用户
提问于 2014-10-24 22:52:53
回答 2查看 793关注 0票数 3

我有以下wx.Window

代码语言:javascript
复制
class SketchWindow(wx.Window):

  def __init__(self, parent):
    wx.Window.__init__(self, parent, -1)
    self.SetBackgroundColour('White')
    # Window event binding
    self.Bind(wx.EVT_PAINT, self.OnPaint)
    self.Bind(wx.EVT_IDLE, self.OnIdle)
    # run
    self.Run()

  def OnPaint(self, evt):
    self.DrawEntities(wx.PaintDC(self))

  def DrawEntities(self, dc):
    dc.SetPen(wx.Pen('Black', 1, wx.SOLID))
    dc.SetBrush(wx.Brush('Green', wx.SOLID))
    # draw all
    for e in self.entities:
      x, y = e.location
      dc.DrawCircle(x, y, 4)

  def OnIdle(self, event):
    self.Refresh(False)

  def Run(self):
    # update self.entities ...
    # call this method again later
    wx.CallLater(50, self.Run)

我需要在我的窗口上每隔N毫秒(在我的例子中是50)画一个0,2000个圆圈,这些圆圈在每一步都会更新它们的位置。

我写的方法可以工作(圆圈也是抗锯齿的),但速度很慢。有没有办法改进我的解决方案?

EN

回答 2

Stack Overflow用户

发布于 2014-10-25 04:22:48

我认为更好的性能的基本想法是在屏幕外绘制到内存,然后将结果blit到屏幕上。您可以使用BufferedCanvas来完成此操作(链接页面底部给出了示例)。

票数 1
EN

Stack Overflow用户

发布于 2017-10-31 04:01:08

你最好解释一下为什么你把这个描述为相当慢。(此代码看起来可能是台球桌模拟的一部分)。在这一点上,一些时间分析会对你有所帮助。我必须添加很多代码才能运行您的代码片段,但一些快速的观察结果是: 1)您可能需要在OnPaint()例程中使用dc.Clear(),否则您将得到先前绘制的所有圆的“轨迹”。此外,您还可以使用缓冲的DC来获得更平滑的图形更新,方法是更改

代码语言:javascript
复制
def OnPaint(self, evt):
    self.DrawEntities(wx.PaintDC(self))

代码语言:javascript
复制
 def OnPaint(self, evt):
     self.DrawEntities(wx.BufferedPaintDC(self))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26550473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档