myjcn 发表于 2024-5-27 09:40:04

wxPython 窗体控件打靶定位

最近刚开始学习wxPython,发现控件在窗体中的位置不太好确定,所以写了以下代码

class winMainForm(wx.Frame):
    def __init__(self,parent,title):
      wx.Frame.__init__(self, parent, title=title, size=(800,600))
      self.panel = wx.Panel(self)
      self.panel.Bind(wx.EVT_MOTION, self.OnMove)
      self.panel.Bind(wx.EVT_PAINT, self.OnPaint)
      self.line_pos = (-1,-1)
      self.Show()
    def OnMove(self, event):
      x,y = event.GetPosition()
      print('x坐标:{x},y坐标:{y}'.format(x=x, y=y))
      self.line_pos = (x,y)
      self.Refresh()
      self.SetTitle('靶向定位: x坐标({x}),y坐标({y})'.format(x=x,y=y))
      event.Skip()

    def OnPaint(self, event):
      dc = wx.PaintDC(self.panel)
      pen = wx.Pen(wx.Colour(0,0,255))
      dc.SetPen(pen)
      dc.DrawLine(self.line_pos,self.line_pos,self.line_pos+50,self.line_pos)#水平线向右延伸
      dc.DrawLine(self.line_pos,self.line_pos,self.line_pos,self.line_pos+50)#垂直线向下延伸
      dc.DrawLine(self.line_pos-50,self.line_pos,self.line_pos,self.line_pos)#水平线向左延伸
      dc.DrawLine(self.line_pos,self.line_pos-50,self.line_pos,self.line_pos)#垂直线向上延伸

def main():
    try:
      app = wx.App(False)
      winMainForm(None, '鼠标在窗体中的位置')
      app.MainLoop()
    except Exception as e:
      print('程序报错:', e)

if __name__ == '__main__':
    main()

FishC 发表于 2024-5-27 09:40:21

你的代码有一点小问题,导致画线的位置不正确。下面是修改后的代码:

import wx

class winMainForm(wx.Frame):
    def __init__(self,parent,title):
      wx.Frame.__init__(self, parent, title=title, size=(800,600))
      self.panel = wx.Panel(self)
      self.panel.Bind(wx.EVT_MOTION, self.OnMove)
      self.panel.Bind(wx.EVT_PAINT, self.OnPaint)
      self.line_pos = (-1,-1)
      self.Show()
   
    def OnMove(self, event):
      x,y = event.GetPosition()
      print('x坐标:{x},y坐标:{y}'.format(x=x, y=y))
      self.line_pos = (x,y)
      self.Refresh()
      self.SetTitle('靶向定位: x坐标({x}),y坐标({y})'.format(x=x,y=y))
      event.Skip()

    def OnPaint(self, event):
      dc = wx.PaintDC(self.panel)
      pen = wx.Pen(wx.Colour(0,0,255))
      dc.SetPen(pen)
      
      # 画水平线
      dc.DrawLine(self.line_pos - 50, self.line_pos, self.line_pos + 50, self.line_pos)
      # 画垂直线
      dc.DrawLine(self.line_pos, self.line_pos - 50, self.line_pos, self.line_pos + 50)

def main():
    try:
      app = wx.App(False)
      winMainForm(None, '鼠标在窗体中的位置')
      app.MainLoop()
    except Exception as e:
      print('程序报错:', e)

if __name__ == '__main__':
    main()

在`OnPaint`方法中,我们需要使用正确的坐标来画线。你之前的代码中使用了`self.line_pos`来画线,这是不正确的。我们需要分别使用`self.line_pos`和`self.line_pos`来表示x坐标和y坐标。同时,延伸的距离应该是加减50,而不是使用`+`运算符。

希望这次修改能够解决你的问题!如果还有其他问题,请随时提问。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

myjcn 发表于 2024-5-27 09:46:24

受教了,谢谢

FishC 发表于 2024-5-27 09:46:29

myjcn 发表于 2024-05-27 09:46
受教了,谢谢

不客气!如果还有其他问题,随时来问我。祝你学习wxPython愉快!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: wxPython 窗体控件打靶定位