【问题标题】:How can i constantly get my mouse position outside of Tkinter window with Python?如何使用 Python 不断地将鼠标位置移到 Tkinter 窗口之外?
【发布时间】:2020-07-27 04:10:55
【问题描述】:

有没有办法不断获取我的鼠标位置并用 Python 打印出来?我知道使用 Tkinter,您可以通过将鼠标运动与类似的东西绑定来实现这一点,但我想要在 Tkinter 创建的窗口之外也能工作的东西

def motion(event):
    posx, posy = pyautogui.position()
    print("PosX = " + str(posx) + " PosY = " + str(posy))
root.bind('<Motion>', motion)

编辑:感谢您的回答,但我的问题不是很清楚,我需要一种在后台工作的方式,同时我可以在我的代码上使用其他方法。如果我使用 while True 我将被锁定在此方法中。我需要与 root.bind('&lt;Motion&gt;', motion) 完全一样的东西,但它可以在根窗口之外工作,例如。

【问题讨论】:

  • 可能有帮助 - 鼠标位置 stackoverflow.com/questions/22925599/…
  • 单独使用 tkinter 无法做到这一点。
  • @BryanOakley 没问题,我使用了 Tkinter 示例,因为更容易展示我需要的内容,但我对其他库/解决方案持开放态度。

标签: python tkinter


【解决方案1】:

您可以使用after()winfo_pointerxy() 不断获取鼠标位置:

import tkinter as tk

root = tk.Tk()

lbl = tk.Label(root, width=20)
lbl.pack()

def get_mouse_pos():
    lbl.config(text='{}, {}'.format(*root.winfo_pointerxy()))
    root.after(100, get_mouse_pos)

get_mouse_pos()
root.mainloop()

【讨论】:

    【解决方案2】:

    您可以通过非常简单的方式做到这一点。您将需要 pyautogui

    import pyautogui
    
    while True:
        print(pyautogui.position())
    

    输出:

    Point(x=708, y=380)
    

    【讨论】:

      【解决方案3】:

      试试这个对你有帮助

      #!/usr/bin/python
      
      import struct
      import binhex
      
      # You'll need to find the name of your particular mouse to put in here...
      file = open("/dev/input/by-id/usb-Logitech_USB_Trackball-event-mouse","rb")
      
      
      while True:
           byte = file.read(16)
      #    h = ":".join("{:02x}".format(ord(c)) for c in byte)
      #    print "byte=",h
      
          (type,code,value) =  struct.unpack_from('hhi', byte, offset=8)
      
          if type == 1 and value == 1:
              if code == 272:
                  print ("LEFT PRESS")
              if code == 273:
                  print("RIGHT PRESS")
      
          if type == 2:
              if code == 0:
                  print("MOVE L/R",value)
              if code == 1:
                  print("MOVE U/D",value)
      

      【讨论】:

        【解决方案4】:

        通过使用pyxhook 库(Linux 的pyhook 实现)设法做到这一点。通过使用此解决方案,您将不会遇到被锁定在while True 循环中的缺点。要停止捕获,只需按“Esc”(event.Ascii == 27)。

        import pyxhook
        import pyautogui
        
        def mouse_event(event):
            posx, posy = pyautogui.position()
            print ("PosX: " + str(posx) + ", PosY: " + str(posy))
        
        def cancel_hookmanager(event):
            if event.Ascii == 27:
                hookman.cancel()
        
        hookman = pyxhook.HookManager()
        hookman.MouseMovement = mouse_event
        hookman.KeyUp = cancel_hookmanager
        hookman.HookKeyboard
        hookman.HookMouse
        hookman.start()
        

        【讨论】:

          猜你喜欢
          • 2015-12-22
          • 1970-01-01
          • 2021-09-02
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-11-18
          • 1970-01-01
          • 2020-12-31
          相关资源
          最近更新 更多