嗨,我正在使用wxpython绘制一个项目圈.请仔细查看代码并告诉我我做错了什么,它甚至没有显示任何错误,但也没有绘制圆圈.我只是得到一个空白的窗口.
import wx
class SketchFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Sketch Frame",size=(350,350))
self.sketch = SketchWindow(self, -1)
class SketchWindow(wx.Window):
def __init__ (self, parent,ID):
wx.Window.__init__(self, parent, ID)
self.panel =wx.Panel(self, size= (350,350))
self.InitBuffer()
def InitBuffer(self):
size=self.GetClientSize()
self.Buffer=wx.EmptyBitmap(size.width,size.height)
dc=wx.BufferedDC(None,self.Buffer)
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
self.Drawcircle(dc)
self.reInitBuffer=False
def Drawcircle(self,dc):
pen=wx.Pen('blue',4)
dc.SetPen(pen)
dc.DrawCircle(100,100,50)
def OnPaint(self, event):
dc = wx.BufferedPaintDC(self, self.buffer)
if __name__=='__main__':
app=wx.PySimpleApp()
frame=SketchFrame(None)
frame.Show(True)
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
谢谢
多个问题
你没有绑定到EVT_PAINT,例如self.Bind(wx.EVT_PAINT,self.OnPaint)
在OnPaint中绘制,但如果要先绘制然后重用该位图,则onPaint中不需要BufferedPaintDC
使用wx.MemoryDC直接绘制到缓冲区
您正在Window中创建一个面板,它将覆盖您在窗口中绘制的任何内容,因此请将其删除
您正在初始化初始化InitBuffer,其中大小可能不正确或者您应该在调整大小或调用onPaint时执行此操作并检查大小是否已更改,以便在调整大小时在窗口中心正确绘制圆圈
覆盖EVT_ERASE_BACKGROUND以避免闪烁
这是更新的代码
import wx
class SketchFrame(wx.Frame):
def __init__(self, parent):
wx.Frame.__init__(self, parent, -1, "Sketch Frame",size=(350,350))
self.sketch = SketchWindow(self, -1)
class SketchWindow(wx.Window):
def __init__ (self, parent,ID):
wx.Window.__init__(self, parent, ID)
self.Buffer = None
self.Bind(wx.EVT_PAINT, self.OnPaint)
self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBack)
def InitBuffer(self):
size=self.GetClientSize()
# if buffer exists and size hasn't changed do nothing
if self.Buffer is not None and self.Buffer.GetWidth() == size.width and self.Buffer.GetHeight() == size.height:
return False
self.Buffer=wx.EmptyBitmap(size.width,size.height)
dc=wx.MemoryDC()
dc.SelectObject(self.Buffer)
dc.SetBackground(wx.Brush(self.GetBackgroundColour()))
dc.Clear()
self.Drawcircle(dc)
dc.SelectObject(wx.NullBitmap)
return True
def Drawcircle(self,dc):
size=self.GetClientSize()
pen=wx.Pen('blue',4)
dc.SetPen(pen)
dc.DrawCircle(size.width/2,size.height/2,50)
def OnEraseBack(self, event):
pass # do nothing to avoid flicker
def OnPaint(self, event):
if self.InitBuffer():
self.Refresh() # buffer changed paint in next event, this paint event may be old
return
dc = wx.PaintDC(self)
dc.DrawBitmap(self.Buffer, 0, 0)
self.Drawcircle(dc)
if __name__=='__main__':
app=wx.PySimpleApp()
frame=SketchFrame(None)
frame.Show(True)
app.MainLoop()
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5586 次 |
| 最近记录: |