拖放功能在 Customtkinter 中不起作用

问题描述 投票:0回答:1

我正在尝试创建一个简单的拖放机制,让您可以使用 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 的工作方式不同 或者对简单的拖放机制有任何其他想法,我们将不胜感激:)

提前谢谢您。

python tkinter drag-and-drop coordinates customtkinter
1个回答
0
投票

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)
© www.soinside.com 2019 - 2024. All rights reserved.