【问题标题】:Entry.place(X,Y) won't workEntry.place(X,Y) 不起作用
【发布时间】:2016-05-06 17:45:46
【问题描述】:

我正在尝试在 [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] 中的一行时,条目不会在正确的位置弹出。 .. 但是当我点击 [tree] 中的一行时,在正确位置的条目弹出...

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

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

【问题讨论】:

    标签: python python-3.x tkinter ttk


    【解决方案1】:

    事件坐标是相对于获得事件的小部件。

    当您单击底部小部件的左上角时,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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-04-20
      • 2013-07-03
      • 2013-10-31
      • 1970-01-01
      • 2017-11-23
      • 1970-01-01
      相关资源
      最近更新 更多