Entry.place(X,Y) не будет работать

Я пытаюсь отобразить запись в [x,y (координата двойного щелчка мыши) .

import tkinter
from tkinter import *
from tkinter import ttk

def Click(event):
    PX = event.x
    PY = event.y
    En = Entry(Windo)
    En.place(x=PX ,y=PY)

Windo = Tk()
EList = ["A","B","C","D"]
Windo.bind("<Double-Button-1>" ,Click)
tree = ttk.Treeview(Windo)
tree.pack()
Tree = ttk.Treeview(Windo)
Tree.pack()
for element in EList:
    Tree.insert('' ,'end' ,text=element)

Таким образом, с помощью приведенного выше кода я могу сделать то, что хотел (всплывающее окно Entry в X,Y), но когда я дважды щелкаю по строке в моем [Tree], Entry не появляется в правильном положении... Но когда я нажимаю на строку в [tree], всплывающее окно Entry в правильной позиции...

поэтому я попробовал что-то другое (привязать к дереву), но произошло то же самое:

Tree.bind("<Double-Button-1>" ,Click)

1 ответ

Решение

Координаты события относятся к виджету, который получил событие.

При нажатии в верхнем левом углу нижнего виджета значения x,y будут равны 0,0, потому что именно там вы щелкнули относительно виджета. Когда вы используете placeкоординаты также относятся к виджету, в который вы помещаете виджет.

В вашем случае, скажем, вы нажимаете 20,20 в нижнем окне. Это то что event.x а также event.y отчет. Тем не менее, вы устанавливаете родительский элемент нового виджета входа в Windo, поэтому размещение виджета в 20,20 пойдет в координату 20,20 Windo а не 20,20 виджета, по которому вы щелкнули. Именно поэтому он появляется в верхней части окна.

Есть несколько способов исправить это, в зависимости от того, что вы действительно хотите сделать. Например, если вы пытаетесь создать виджет под мышью, простое решение - сделать виджет дочерним по отношению к виджету, на который вы щелкнули, а не всегда делать его корневым окном.

Например:

def Click(event):
    ...
    En = Entry(event.widget)
    ...

Это создает проблему, если вы щелкаете по краю виджета, виджет ввода может быть скрыт, поскольку он не может выходить за границы своего родительского элемента.

Если вы хотите, чтобы запись всегда была виджетом корня (и, следовательно, не скрывалась никакими другими виджетами), вам необходимо перевести координаты события относительно корня, а не относительно виджета:

def Click(event):
    PX = event.widget.winfo_x() + event.x
    PY = event.widget.winfo_y() + event.y
    En = Entry(Windo)
    En.place(x=PX ,y=PY)
Другие вопросы по тегам