我正在尝试创建一个简单的拖放机制,让您可以使用 tkinter 在屏幕上单击和拖动小部件。 (我使用了来自 https://www.youtube.com/watch?v=uGmMsGOcBB0 的代码)
import tkinter as tk
def drag_start(event):
label.startX = event.x
label.startY = event.y
def drag_motion(event):
x = label.winfo_x() - label.startX + event.x
y = label.winfo_y() - label.startY + event.y
label.place(x=x, y=y)
window = tk.Tk()
label = tk.Label(window, bg_color="red", width=10, height=5)
label.place(x=0, y=0)
label.bind("<Button-1>", drag_start)
label.bind("<B1-Motion>", drag_motion)
window.mainloop()
这按预期工作,并且使用默认的 tkinter 小部件。 但是,当我尝试将 tkinter 小部件切换为自定义 tkinter 小部件时:
import customtkinter as ctk
def drag_start(event):
label.startX = event.x
label.startY = event.y
def drag_motion(event):
x = label.winfo_x() - label.startX + event.x
y = label.winfo_y() - label.startY + event.y
label.place(x=x, y=y)
window = ctk.CTk()
label = ctk.CTkLabel(window, bg_color="red", width=10, height=5)
label.place(x=0, y=0)
label.bind("<Button-1>", drag_start)
label.bind("<B1-Motion>", drag_motion)
window.mainloop()
...坐标似乎突然以不同的方式工作,因为小部件不会停留在鼠标下方并且定位完全关闭。 (有点难以解释:)只需复制粘贴代码并尝试一下即可)
所以如果有人知道 customtkinter 与默认 tkinter 的工作方式不同 或者对简单的拖放机制有任何其他想法,我们将不胜感激:)
提前谢谢您。
CTkLabel
类是tk.Frame
的后代,具有称为tk.Label
的text_label
属性。当您绑定到 CTkLabel
时,绑定将传递到底层 tk.Frame
。由于框架被标签填充,因此单击和拖动事件将转到标签,而不是框架,因此不会发生任何事情。要解决此问题,请绑定到 text_label
:
label.text_label.bind("<Button-1>", drag_start)
label.text_label.bind("<B1-Motion>", drag_motion)