首页 > 解决方案 > 如何在 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. 这似乎可行,但是我怀疑这可能是一种不好的做法或其他东西,如果它看起来与我上面链接的示例有很大不同,我试图理解为什么这个案例有效,而我的第一次尝试却没有。提前感谢您的帮助。

标签: pythontkinter

解决方案


这是一个代码片段,它将在画布坐标中显示当前鼠标位置。

它使用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()

推荐阅读