改进wxPython OnPaint

时间:2014-10-24 14:52:53

标签: python canvas wxpython drawing

我有以下wx.Window

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],在每个步骤中这些圆圈可以更新它们的位置。

我写的方法有效(圆圈也有反锯齿),但速度很慢。 有没有办法改善我的解决方案?

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

你应该更好地解释为什么你把它描述得很慢。 (这段代码看起来可能是台球桌模拟的一部分)。一些时间分析会帮助你。我不得不添加大量代码来运行代码片段,但是一些快速观察是1)你可能需要在你的OnPaint()例程中使用dc.Clear(),否则你将获得所有先前绘制的圆圈的“踪迹” 。此外,您可以通过更改

使用缓冲DC来获得更平滑的图形更新
// boot-client.ts file 
import 'ngx-charts';

// some.component.ts
import { isBrowser } from 'angular2-universal';
import * as $ from 'jquery';

// inside ngOnInit 
if (isBrowser) { 
    $('body').hide();  // or whatever call you need to make
}

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