wxPython - PaintDC未刷新
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
这个选项,让面板在调整大小时自动重新绘制。