You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 09:51:46