python - 如何在 tkinter 上跟踪鼠标移动
问题描述
我想学习如何在我正在设计的 tkinter 应用程序中跟踪鼠标移动。我已经设法按照这个问题的示例将以下代码放在一起,其输出是鼠标在网格中移动时的坐标:
import tkinter as tk
class MyGUI(tk.Frame):
def __init__(self, parent):
tk.Frame.__init__(self, parent)
# define variables
GRID = 25
X = GRID*20
Y = GRID*15
wid = 15
hei = 25
# create canvas
self.canvas = tk.Canvas(width=X+1, height=Y+1, background='white',
highlightthickness=1, highlightbackground='black')
self.canvas.pack()
# create grid
for i in range(0, Y, GRID):
self.canvas.create_line(0, i, X, i, fill='gray')
for i in range(0, X, GRID):
self.canvas.create_line(i, 0, i, Y, fill='gray')
# get mouse position
self.mouse_pos = (0, 0)
self.bind('<Motion>', self.motion)
def motion(self, event):
"""Get mouse position"""
self.mouse_pos = event.x, event.y
print('{}, {}'.format(event.x, event.y))
if __name__ == "__main__":
app = tk.Tk()
app.title('hi')
MyGUI(app).pack()
app.mainloop()
但是,当我运行代码并将鼠标悬停在网格上时,我什么也没得到(没有错误也没有输出)。我已经玩过并设法以下列方式更改了代码的最后几行 29-39
# get mouse position
def motion(event):
"""Get mouse position"""
x, y = event.x, event.y
print('{}, {}'.format(event.x, event.y))
app.bind('<Motion>', motion)
它包含在class
. 这似乎可行,但是我怀疑这可能是一种不好的做法或其他东西,如果它看起来与我上面链接的示例有很大不同,我试图理解为什么这个案例有效,而我的第一次尝试却没有。提前感谢您的帮助。
解决方案
这是一个代码片段,它将在画布坐标中显示当前鼠标位置。
它使用canvas.canvasx(event.x)
和canvas.canvasy(event.y)
来生成正确的值。
import tkinter as tk
root = tk.Tk()
frame = tk.LabelFrame(root, labelanchor = tk.S, text = "00|00")
frame.grid(row = 0, column = 0, sticky = tk.NSEW)
canvas = tk.Canvas(frame, width = 640, height = 400)
canvas.grid(row = 0, column = 0, sticky = tk.NSEW)
# get mouse position
def motion(event):
"""Get mouse position"""
x, y = canvas.canvasx(event.x), canvas.canvasy(event.y)
frame["text"] = "{}|{}".format(x, y)
canvas.bind("<Motion>", motion)
root.mainloop()
推荐阅读
- laravel - 一般错误:1364 字段“products_id”没有默认值
- excel - 在循环期间刷新数据
- python - 在熊猫数据框中使用 numpy.gradient 计算梯度的间距值
- python - 使用来自另一个 Pyspark 数据帧的行信息过滤和求和一个 Pyspark 数据帧
- kotlin - java.time 格式日期取决于区域设置,2 位数的日/月和 4 位数的年份
- r - 在 tidyverse 管道中同时获取 xml_attrs 和 xml_text
- java - 每 1 分钟运行一次 springboot 应用程序并同步每个控制器
- javascript - Cordova iOS 音频和视频标签的静音属性不起作用?
- apache - 使用可选查询字符串 (.htaccess) 重定向
- node.js - Nodej.js 强制客户端在请求标头中发送 Cookie