2012-04-14 84 views
0

我正在學習如何使用Python和特別是wxPython來做gui。我想寫下一個程序在藍色背景上繪製模糊球。我將權重分配給點擊座標周圍的點,從0到1,中間點是1,如果我們遠離點擊點,它會逐漸減少。 我寫的代碼過於緩慢,需要幾秒鐘才能更新圖片。我可以看到程序如何從左到右更新圖片。,如何快速填充所有像素?

我使用dc.DrawPoint(i,j)繪製每個像素,其中dc = wx.PaintDC(self)在我的班表示主窗口。窗口的大小是600x400像素。 我的問題是如何加速繪圖過程。有沒有辦法做到這一點?

編輯: 好吧,我明白,我不應該繪製每個像素。 如何使用位圖繪製?我的程序的

代碼:

import wx 
import random 
import numpy 

class FuzzyBalls(wx.Frame): 
def __init__(self, parent, id, title): 
    wx.Frame.__init__(self, parent, id, title, size=(600, 400)) 
    self.Bind(wx.EVT_PAINT, self.OnPaint) 
    self.Bind(wx.EVT_LEFT_DOWN, self.OnPaint) 
    self.Centre() 
    self.Show(True) 

def OnPaint(self, event): 
    dc = wx.PaintDC(self) 
    w, h = self.GetSize() 
    b = 20 
    x0 = 300 
    y0 = 200 
    eta = 0.0001 
    panel_pos = self.ScreenToClient(wx.GetMousePosition()) 
    print panel_pos 
    x0, y0 = panel_pos 
    field = numpy.zeros(w*h).reshape((h,w)) 
    field = numpy.matrix(field) 
    for i in xrange(h): 
     for j in xrange(w): 
      field[i,j] = numpy.exp(-eta*((i-y0)**2 + (j-x0)**2)) 
    z = field.sum(axis = 1).sum(axis = 0)[0,0] 
    field = field/z 
    n = 29000 
    for i in xrange(w): 
     for j in xrange(h): 
      r = int(n*255*field[j,i]) 
      if r > 253: 
       r = 253 
      dc.SetPen(wx.Pen(wx.Colour(r,r,b))) 
      dc.DrawPoint(i,j) 

app = wx.App() 
FuzzyBalls(None, -1, 'Points') 
app.MainLoop() 
+1

「我繪製每個像素」我認爲我們發現了問題... – 2012-04-14 22:46:48

回答

2

永遠不要不斷繪製每個像素,尤其不顯示。在離屏位圖上繪製,然後在顯示屏上閃爍。預先畫出每一個你可以逃脫的畫面,這樣你就不需要爲程序的生命再畫一次。

+0

你能告訴我應該怎麼做嗎? – ashim 2012-04-14 23:19:41

+0

創建一個合適大小的wxBitmap,使用wxMemoryDC來繪製它,然後使用wxDC :: Blit來從中獲取。 – 2012-04-14 23:34:21

+0

我只是爲此搜索,找到了這個答案,我也很想看到這種技術的一個例子。你爲什麼不能顯示它? – MightyPork 2014-11-13 20:44:02