2012-04-14 1 views
0

私はPythonと特にwxPythonを使ってguiを行う方法を学んでいます。青い背景にファジーボールを描く次のプログラムを書いてみたい。私は、0から1までのクリック座標の周りのポイントにウェイトを割り当て、途中では1であり、クリックポイントから遠ざかると徐々にウェイトが減少します。 私が書いたコードは遅すぎるので、画像を更新するのに数秒かかります。プログラムが左から右にどのように更新されたかを見ることができます。wxPythonを使用して描画すると、どのくらいの速さですべてのピクセルが塗りつぶされますか?

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

"私は各ピクセルを描く"私は問題を見つけたと思う... –

答えて

2

決してこれまで各ピクセルを描画し、特にないディスプレイへ。画面外のビットマップに描画し、次に表示にblitします。あなたはあらかじめ離れていくことができるすべての単一のフレームを描きます。そのため、プログラムの生涯にわたって再び描画する必要はありません。

+0

私はそれをどうすればいいのか分かりますか? – ashim

+0

適切なサイズのwxBitmapを作成し、wxMemoryDCを使用して描画してから、wxDC :: Blitを使用してblitします。 –

+0

私はちょうどこれについてグーグルで、この答えを見つけました。また、このテクニックの例を見たいと思っています。なぜあなたはそれを見せないのですか? – MightyPork

関連する問題