【问题标题】:python3 tkinter event.x event.y negative valuespython3 tkinter event.x event.y 负值
【发布时间】:2019-12-01 18:27:29
【问题描述】:

在使用下面复制的代码时,我注意到在 Press-Release 和 Motion 动作中,当我们将鼠标从右向左移动时,tkinter 会报告负的 event.x 值。

我的问题:为了正确识别鼠标最终停留的小部件,无论采用何种方向,识别包含框架中 (event.x, event.y) 点的正确方法是什么?

#!/usr/bin/env python3
from tkinter import *

root = Tk()

def press(event):
    print(f"{event.widget} clicked at: {event.x, event.y}")
    print(f"{event.widget.grid_info()}")

def release(event):
    print("RELEASE")
    end_x, end_y = event.x, event.y
    print(f"{end_x, end_y}")
    locate(end_x, end_y)

def motion(event):
    print(f"{event.widget}: mouse position motion at {event.x, event.y}")

def locate(end_x, end_y):
    end_x = int(end_x)
    end_y = int(end_y)
    print(f"Released at {fr.grid_location(end_x, end_y)}")
    end_col, end_row = fr.grid_location(end_x, end_y)
    print(end_col, end_row)
    print(f"Actual frame info: {fr.grid_info()}")

fr = Frame(root, width=200, height=300,bg="dark blue")
fr.grid(sticky=NSEW, padx=2, pady=2)
lbl1 = Label(master=fr, text="LABEL 1", padx=2, pady=2, width=10, relief=SUNKEN)
lbl1.grid(column=0, row=0, sticky=NSEW)
lbl2 = Label(master=fr, text="LABEL 2", padx=2, pady=2, width=10, relief=SUNKEN)
lbl2.grid(column=1, row=0, sticky=NSEW)
lbl3 = Label(master=fr, text="LABEL 3", padx=2, pady=2, width=10, relief=SUNKEN)
lbl3.grid(column=2, row=0, sticky=NSEW)
lbl4 = Label(master=fr, text="LABEL 4", padx=2, pady=2, width=10, relief=SUNKEN)
lbl4.grid(column=0, row=1, sticky=NSEW)
lbl5 = Label(master=fr, text="LABEL 5", padx=2, pady=2, width=10, relief=SUNKEN)
lbl5.grid(column=1, row=1, sticky=NSEW)
lbl6 = Label(master=fr, text="LABEL 6", padx=2, pady=2, width=10, relief=SUNKEN)
lbl6.grid(column=2, row=1, sticky=NSEW)

lbl1.bind_all("<Button-1>", press)
lbl1.bind_all("<ButtonRelease-1>", release)
lbl1.bind_all("<B3-Motion>", motion)
lbl1.bind_all("<ButtonRelease-3>", release)

root.mainloop()

谢谢。

【问题讨论】:

    标签: python-3.x tkinter


    【解决方案1】:

    为了正确识别鼠标最终停留的小部件,无论采用何种方向,识别包含框架中 (event.x, event.y) 点的正确方法是什么?

    release 事件的 x/y 坐标是相对于获取 press 事件的小部件,这解释了为什么这些值可以为负数。

    用于在光标下查找小部件的坐标是event.x_rootevent.y_root,您可以将它们传递给winfo_containing 以获取实际的小部件。

    例如:

    def release(event):
        window = root.winfo_containing(event.x_root, event.y_root)
        print(f"window under the cursor: {window}")
    

    【讨论】:

      猜你喜欢
      • 2021-06-27
      • 2014-02-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-09
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多