wxPython - PaintDC未刷新

0 投票
2 回答
1905 浏览
提问于 2025-04-15 19:15

import wx

class TestDraw(wx.Panel):
    def __init__(self,parent=None,id=-1):
        wx.Panel.__init__(self,parent,id)
        self.SetBackgroundColour("#FFFFFF")
        self.Bind(wx.EVT_PAINT,self.onPaint)
    def onPaint(self, event):
        event.Skip()

        dc=wx.PaintDC(self)
        dc.BeginDrawing()
        width=dc.GetSize()[0]
        height=dc.GetSize()[1]
        if height<width:
            self.drawTestRects(dc)
        else:
            dc.Clear()
        dc.EndDrawing()

    def drawTestRects(self,dc):
        dc.SetBrush(wx.Brush("#000000",style=wx.SOLID))
        dc.DrawRectangle(50,50,50,50)
        dc.DrawRectangle(100,100,100,100)

class TestFrame(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title, size=(640,480))
        self.mainPanel=TestDraw(self,-1)

        self.Show(True)


app = wx.App(False)
frame = TestFrame(None,"Test App")
app.MainLoop()

这段代码的意思是,当矩形的高度小于宽度时,应该画出测试用的矩形;如果不是这样,窗口就应该保持空白。不过,如果你调整窗口的大小,面板其实不会重新绘制,除非把它移出窗口。请问我哪里出错了呢?

2 个回答

0

关于一个叫做 SizeEvent 的东西,文档提到当绘图依赖于窗口的大小时,可能会出现一些复杂的问题。我不太清楚背后到底发生了什么。我按照链接里的建议,在 onPaint() 的开头加上了 self.Refresh() 这个调用,结果看起来达到了我想要的效果。想要更高效的代码示例,可以看看mghie的回答。

2

你可以把一个方法绑定到 wx.EVT_SIZE 事件上,这样当面板大小改变时就会调用这个方法,里面可以处理一些事情。或者,你也可以直接使用 wx.FULL_REPAINT_ON_RESIZE 这个选项,让面板在调整大小时自动重新绘制。

撰写回答