用Python显示鼠标位置

1 投票
1 回答
2405 浏览
提问于 2025-04-17 05:49

我想要追踪鼠标的位置,并在一个小窗口里显示出来。为此,我写了这段代码:

#! /usr/bin/python

from Tkinter import *
from Xlib import display

def mousepos():
    data = display.Display().screen().root.query_pointer()._data
    return data["root_x"], data["root_y"]

root = Tk()
strl = "mouse at {0}".format(mousepos())
lab = Label(root,text=strl)
lab.pack()
root.title("Mouseposition")

root.mainloop()

这个小脚本在启动时会显示鼠标的位置,但在鼠标移动时不会更新。我搞不明白这是为什么(我是不是说过我刚学python?)。我觉得我需要用到Xlib中的一个事件,来告诉我的脚本鼠标什么时候在移动……

我该怎么更新我的鼠标位置呢?

1 个回答

2
  1. 使用 root.after 来定期调用 update
  2. strl = tk.StringVar()tk.Label(...,textvariable=strl) 来让标签的文字可以改变。
  3. 调用 strl.set() 来更改标签的文字。
  4. screenroot 设置一个默认值,等于 display.Display().screen().root,这样在每次调用 mousepos 时,就不用重复写那么长的一串函数调用了。如果不带任何参数调用 mousepos(),它依然会照常工作。

import Tkinter as tk
import Xlib.display as display

def mousepos(screenroot=display.Display().screen().root):
    pointer = screenroot.query_pointer()
    data = pointer._data
    return data["root_x"], data["root_y"]

def update():
    strl.set("mouse at {0}".format(mousepos()))
    root.after(100, update)

root = tk.Tk()
strl = tk.StringVar()
lab = tk.Label(root,textvariable=strl)
lab.pack()
root.after(100, update)
root.title("Mouseposition")
root.mainloop()

撰写回答