python3 tkinter event.x event.y отрицательные значения - PullRequest
1 голос
/ 01 декабря 2019

При использовании кода, воспроизведенного ниже, я заметил, что в действиях 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()

Спасибо.

1 Ответ

0 голосов
/ 01 декабря 2019

для целей правильной идентификации виджета, в котором, наконец, покоилась мышь, независимо от выбранного направления, как правильно определить точки (event.x, event.y) в содержащей рамке?

Координаты x / y события выпуска относятся к виджету, который получил событие нажатия, что объясняет, почему значения могут быть отрицательными.

Для поиска виджета под курсором используются координаты event.x_root и event.y_root, которые можно передать на winfo_containing для получения фактического виджета.

Например:

def release(event):
    window = root.winfo_containing(event.x_root, event.y_root)
    print(f"window under the cursor: {window}")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...