使用wxpython绘制一个圆圈

Mad*_*ura 0 wxpython

嗨,我正在使用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)

谢谢

Anu*_*yal 6

多个问题

  1. 你没有绑定到EVT_PAINT,例如self.Bind(wx.EVT_PAINT,self.OnPaint)

  2. 在OnPaint中绘制,但如果要先绘制然后重用该位图,则onPaint中不需要BufferedPaintDC

  3. 使用wx.MemoryDC直接绘制到缓冲区

  4. 您正在Window中创建一个面板,它将覆盖您在窗口中绘制的任何内容,因此请将其删除

  5. 您正在初始化初始化InitBuffer,其中大小可能不正确或者您应该在调整大小或调用onPaint时执行此操作并检查大小是否已更改,以便在调整大小时在窗口中心正确绘制圆圈

  6. 覆盖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)