在wxPython中用鼠标绘制的圆圈与鼠标位置不一致

时间:2014-02-01 23:27:44

标签: wxpython

我正试图通过单击鼠标在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()

1 个答案:

答案 0 :(得分:0)

答案是“这不是您绘制自定义控件的方式”。

您需要使用EVT_PAINT事件绘制自定义控件,并使EVT_PAINT事件在适当的时间发生(使用Refresh()和Update())。

您的应用程序需要重新构建,以便在OnLeftDown事件中保存每个圆圈的位置,并在EVT_PAINT上重新绘制所有圆圈。

阅读“常见错误”部分here

特别是:

  

错误:在wxClientDC上绘制一些东西,并期望它会留在那里,直到你绘制其他东西(错误,因为你的窗口管理器可能随时扔掉你的绘图 - 例如,如果窗口被最小化或隐藏在其他东西后面 - 并且将希望你能在以后收到油漆事件时把它画回来)


(你的圈子没有出现的原因是因为wx必须决定在创建新的DC之前没有理由刷新屏幕。这种行为依赖于窗口管理器,这可能解释了为什么Jerry_Y看到了不同的东西。我的情况是,当窗口被另一个窗口短暂遮挡时,圆圈会停留在那里,但当窗口最小化并重新打开时,它们会消失。)