Entry.place(X,Y)无法工作

时间:2016-05-06 17:45:47

标签: python python-3.x tkinter ttk

我试图在[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)

所以使用上面的代码,我能够真正做到我想要的(在X,Y处输入一个条目)但是当我双击我的[Tree]中的一行时,Entry不会弹出正确的位置...... 但是当我点击[树]中的一行时,条目弹出窗口位于正确的位置......

所以我尝试了不同的东西(绑定到树),但同样的事情发生了:

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

1 个答案:

答案 0 :(得分:2)

事件坐标是相对于获取事件的窗口小部件。

当您单击底部窗口小部件的左上角时,x,y将为0,0,因为这是您单击相对于窗口小部件的位置。当您使用place时,坐标也相对于放置小部件的小部件。

在你的情况下,假设你点击底部窗口中的20,20。这就是event.xevent.y报告的内容。但是,您将新条目窗口小部件的父级设置为Windo,因此将窗口小部件放置在20,20将分配Windo的20,20而不是窗口小部件的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)