Tkinter python按钮不跟随光标

monwx1rj  于 2023-11-15  发布在  Python
关注(0)|答案(2)|浏览(179)
from tkinter import *

root=Tk()
root.geometry('450x500')
root.config(bg='#deeffa')

def follow(parent):
    root.bind('\<Motion\>',lambda event,parent=parent:center_mouser(event,parent))
    parent.but.config(command=stop)
def stop():
    root.unbind('\<Motion\>')
def center_mouser(event,parent):
    root.config(cursor="none")
    parent.but.place(x=event.x,y=event.y, anchor='center')
class moving_but():
    def __init__(self,but=None,val=0):
        self.val=val
        self.but=Button(borderwidth=1,text=str(self.val),command=lambda parent=self:follow(parent))
        self.but.pack()

i=moving_but(val=10)

root.mainloop()

字符串
因此,我试图使一个按钮,遵循光标的中心,但我发现,tkinte不允许这一点,并会使按钮之间的光标和左上角 Flink 。如果你做事件。x-50例如,该计划的工作完美,但显然删除按钮的目的。我该如何解决这个问题?

wfypjpf4

wfypjpf41#

我稍微改变了回调函数,并使用.winfo_pointerx()/.winfo_pointery()函数来计算位置:

from tkinter import *

root = Tk()
root.geometry("450x500")
root.config(bg="#deeffa")

def follow():
    root.config(cursor="none")
    root.bind("<Motion>", center_mouser)
    i.but.config(command=stop)

def stop():
    root.config(cursor="")
    root.unbind("<Motion>")
    i.but.config(command=follow)

def center_mouser(event):
    x = root.winfo_pointerx() - root.winfo_rootx() - i.but.winfo_width() // 2
    y = root.winfo_pointery() - root.winfo_rooty() - i.but.winfo_height() // 2

    i.but.place(x=x, y=y, anchor="nw")

class moving_but:
    def __init__(self, but=None, val=0):
        self.val = val
        self.but = Button(
            borderwidth=1,
            text=str(self.val),
            command=follow,
        )
        self.but.pack()

i = moving_but(val=10)
root.config(cursor="")
root.mainloop()

字符串
创建此应用程序:


的数据

f0brbegy

f0brbegy2#

由于绑定在root上,它将被其子窗口继承。也就是说,当鼠标在按钮内移动时,绑定回调将被触发,并且事件(x,y)将相对于按钮,而不是根窗口。
只有当事件由根窗口触发时,才应移动按钮:

def center_mouser(event, parent):
    if event.widget is root:
        parent.but.place(x=event.x, y=event.y, anchor='center')

字符串

相关问题