我正试图通过单击鼠标在wx.Panel上绘制实心圆圈。圆圈出现,但它们与点击鼠标的位置不一致。给定的圆圈仅显示鼠标单击时下次。谁能告诉我我需要做些什么来纠正这个问题?感谢。
import wx
class Test(wx.Frame):
def __init__(self,parent,title):
noResize = wx.DEFAULT_FRAME_STYLE & ~(wx.RESIZE_BORDER | wx.RESIZE_BOX | wx.MAXIMIZE_BOX)
super(Test,self).__init__(parent,style= noResize, title=title,size=(800,800))
self.SetBackgroundColour((0,0,200))
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour('#faf0e6')
self.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.vbox = wx.BoxSizer(wx.VERTICAL)
self.vbox.Add(self.panel,1, wx.EXPAND | wx.ALL, 5)
self.SetSizer(self.vbox)
self.panel.Bind(wx.EVT_LEFT_DOWN, self.OnLeftDown)
self.Center()
self.Show()
def OnLeftDown(self, e):
self.dc = wx.ClientDC(self)
self.dc.SetBrush(wx.Brush('BLUE', wx.SOLID))
x, y = e.GetPosition()
self.dc.DrawCircle(x,y,3)
print x, y
if __name__ == '__main__':
app = wx.App()
Test(None,title='TEST')
app.MainLoop()
答案 0 :(得分:0)
答案是“这不是您绘制自定义控件的方式”。
您需要使用EVT_PAINT事件绘制自定义控件,并使EVT_PAINT事件在适当的时间发生(使用Refresh()和Update())。
您的应用程序需要重新构建,以便在OnLeftDown事件中保存每个圆圈的位置,并在EVT_PAINT上重新绘制所有圆圈。
阅读“常见错误”部分here
特别是:
错误:在wxClientDC上绘制一些东西,并期望它会留在那里,直到你绘制其他东西(错误,因为你的窗口管理器可能随时扔掉你的绘图 - 例如,如果窗口被最小化或隐藏在其他东西后面 - 并且将希望你能在以后收到油漆事件时把它画回来)
(你的圈子没有出现的原因是因为wx必须决定在创建新的DC之前没有理由刷新屏幕。这种行为依赖于窗口管理器,这可能解释了为什么Jerry_Y看到了不同的东西。我的情况是,当窗口被另一个窗口短暂遮挡时,圆圈会停留在那里,但当窗口最小化并重新打开时,它们会消失。)