使用wxPython绘制,填充所有像素的速度有多快?

使用wxPython绘制,填充所有像素的速度有多快?,python,graphics,drawing,wxpython,Python,Graphics,Drawing,Wxpython,我正在学习如何使用Python,尤其是wxPython实现gui。我想写下一个程序在蓝色背景上画模糊球。我在0到1的点击坐标上给点分配权重,中间是1,如果我们远离点击点,它就会逐渐减少。 我的问题是我写的代码太慢了,更新图片需要几秒钟。我可以看到程序是如何从左到右更新图片的 我使用表示主窗口的类中的dc.DrawPoint(I,j)绘制每个像素,其中dc=wx.PaintDC(self)。窗口的大小为600x400像素。 我的问题是如何加速绘图过程。有没有办法做到这一点 编辑: 好吧,我知道我不

我正在学习如何使用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()

永远不要绘制每个像素,尤其是在显示器上。在屏幕外绘制位图,然后快速切换到显示屏。“我画每个像素”我想我们已经找到了问题所在…创建一个适当大小的wxBitmap,使用wxMemoryDC绘制到它,然后使用wxDC::Blit到Blit。我只是在谷歌上搜索,找到了这个答案,我也想看看这种技术的一个例子。为什么你不能展示它?@MightyPork:因为我从来没有在wx做过;我只是简单地描述了在几乎所有现代图形工具包中如何实现这一点。