私は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()
"私は各ピクセルを描く"私は問題を見つけたと思う... –