【问题标题】:Mouse click results in unexpected behavior using wxPython & wx.Panel使用 wxPython 和 wx.Panel 鼠标单击导致意外行为
【发布时间】:2022-01-07 11:28:24
【问题描述】:

我正在编写一个应用程序,其中打算执行以下步骤: 1 - 用户点击蓝色区域(一个 wx.Panel)并出现一个白色圆圈; 2 - 用户点击选择开始按钮; 3 - 用户点击白色圆圈,它变为绿色(通过在白色圆圈上画一个绿色圆圈) 问题是当执行第 3 步时,单击鼠标的位置没有出现绿色圆圈。例如,单击蓝色区域会在 (223, 486) 处注册一个点。单击“选择开始”按钮,然后在白色圆圈中单击一个点,在 (211, 464) 处注册一个点,白色圆圈外出现一个绿色圆圈。我不明白为什么会发生这种情况,并希望在解决问题方面提供任何帮助。 在 MacOs 上使用 python 2.7 和 wxPython 3.0.3.0

import wx

class Test(wx.Frame):
    def __init__(self, parent, title):
        super(Test, self).__init__(parent, title = title, size = (820,900))
        
        self.startSelected = False
        self.radius = 10
        
        
        self.panel = wx.Panel(self, size=(800,800))
        self.panel.SetBackgroundColour(wx.Colour(0,0,200))
        
        self.panel.Bind(wx.EVT_LEFT_DOWN, self.onMouseDown)
        
        self.gbs = wx.GridBagSizer(0,0)   
        
        self.startBtn = wx.Button(self, wx.ID_ANY, label = 'Select Start')
        self.startBtn.Bind(wx.EVT_BUTTON, self.selectStart)
    
        self.gbs.Add(self.panel, span = (1,4), pos=(1,1),flag=wx.EXPAND | wx.ALL)
        self.gbs.Add(self.startBtn, pos=(2,1))

        self.SetSizer(self.gbs)
        
    def onMouseDown(self, e):
        pt = e.GetPosition()
        print pt.x, pt.y
        
        if e.LeftDown():
            if self.startSelected:

                color = wx.Colour(0,255,0)
                self.paint(pt, color)

            else:
                color = wx.Colour(255,255,255)
                self.paint(pt, color)                 
            
    def paint(self, pt, color):
        dc = wx.ClientDC(self)
        b = wx.Brush(color)
        dc.SetBrush(b)
        dc.DrawCircle(pt.x, pt.y, self.radius)
        
    def selectStart(self, e):
        self.startSelected = True
        
            
if __name__ == '__main__':
    app = wx.App()
    Test(None, 'Test')
    app.MainLoop()

【问题讨论】:

    标签: python-2.7 wxpython mouseevent


    【解决方案1】:

    wx.ClientDC 相对于传递给它的对象。正如在绘制方法中编码的那样,dc = wx.ClientDC(self)selfwx.Frame。由于绘图是在wx.Panel 上完成的,所以应该使用dc = wx.ClientDC(self.panel)。这会产生预期的行为。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-20
      • 1970-01-01
      相关资源
      最近更新 更多