Tkinter绘制画布并追踪鼠标指针时坐标无法持续更新问题
问题原因
Tkinter的mainloop()是阻塞式事件循环,一旦调用就会持续占用当前线程处理所有窗口相关的事件(渲染、交互响应等),直到窗口被销毁才会返回,继续执行后续代码。
你把win.mainloop()写在了while True循环内部,第一次循环执行到这行就会被卡住:窗口正常弹出,打印完第一次鼠标坐标后,程序就停在mainloop()的事件处理逻辑里,直到你关闭窗口,mainloop()运行结束才会进入下一轮循环,再次打印坐标。这就是你观察到“仅关窗时坐标才更新”的核心原因。
额外提示:你代码里g_circle.create_oval()传入的offset参数是无效的,Tkinter的create_oval方法没有这个参数,写了也不会生效。
修复方案
不要自己写while True死循环,用Tkinter自带的after()方法做定时轮询即可。这个方法可以在不阻塞主事件循环的前提下,按指定时间间隔重复执行指定函数,完美适配持续获取鼠标位置的需求。
修正后的代码:
from tkinter import * from win32 import win32gui win = Tk() def mouse_pos(): flags, hcursor, (x, y) = win32gui.GetCursorInfo() return {"x": x, "y": y} def print_mouse_pos(): print(mouse_pos()) # 间隔100毫秒执行一次,数值越小打印频率越高,单位是毫秒 win.after(100, print_mouse_pos) win.geometry("1500x900") win.configure(background="black") g_circle = Canvas(win, width=100, height=100, bg="black", bd=1, highlightthickness=0) g_circle.place(x=100, y=100, in_=win) g_circle.create_oval(50, 50, 100, 100, fill="green", outline="white") b_circle = Canvas(win, width=100, height=100, bg="black", bd=1, highlightthickness=0) b_circle.place(x=1300, y=700, in_=win) b_circle.create_oval(50, 50, 100, 100, fill="blue", outline="white") # 启动轮询 print_mouse_pos() # 主循环整个程序生命周期内仅需调用一次,放在代码最后即可 win.mainloop()
运行这段代码,窗口正常显示两个圆点的同时,命令行会持续打印当前鼠标的全局坐标。
内容的提问来源于stack exchange,提问作者kamcho 56
相关产品推荐
相关产品推荐

