gpt4 book ai didi

python - tkinter - 如何拖放小部件?

转载 作者:太空宇宙 更新时间:2023-11-03 12:20:44 24 4
gpt4 key购买 nike

我正在尝试制作一个 Python 程序,您可以在其中移动小部件。

这是我的代码:

import tkinter as tk 
main = tk.Tk()
notesFrame = tk.Frame(main, bd = 4, bg = "a6a6a6")
notesFrame.place(x=10,y=10)
notes = tk.Text(notesFrame)
notes.pack()
notesFrame.bind("<B1-Motion>", lambda event: notesFrame.place(x = event.x, y = event.y)

但是,这会出现 super 故障,小部件会来回跳动。

最佳答案

您观察到的行为是由于事件的坐标是相对于拖动的小部件这一事实引起的。使用相对 坐标更新小部件的位置(在绝对 坐标中)显然会导致困惑。

为了解决这个问题,我使用了 .winfo_x() and .winfo_y()函数(允许将相对坐标转换为绝对坐标),以及 Button-1 事件来确定拖动开始时光标在小部件上的位置。

这是一个使小部件可拖动的函数:

def make_draggable(widget):
widget.bind("<Button-1>", on_drag_start)
widget.bind("<B1-Motion>", on_drag_motion)

def on_drag_start(event):
widget = event.widget
widget._drag_start_x = event.x
widget._drag_start_y = event.y

def on_drag_motion(event):
widget = event.widget
x = widget.winfo_x() - widget._drag_start_x + event.x
y = widget.winfo_y() - widget._drag_start_y + event.y
widget.place(x=x, y=y)

可以这样使用:

main = tk.Tk()

frame = tk.Frame(main, bd=4, bg="grey")
frame.place(x=10, y=10)
make_draggable(frame)

notes = tk.Text(frame)
notes.pack()

如果你想采用更面向对象的方法,你可以写一个mixin这使得类的所有实例都可拖动:

class DragDropMixin:
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)

make_draggable(self)

用法:

# As always when it comes to mixins, make sure to
# inherit from DragDropMixin FIRST!
class DnDFrame(DragDropMixin, tk.Frame):
pass

# This wouldn't work:
# class DnDFrame(tk.Frame, DragDropMixin):
# pass

main = tk.Tk()

frame = DnDFrame(main, bd=4, bg="grey")
frame.place(x=10, y=10)

notes = tk.Text(frame)
notes.pack()

关于python - tkinter - 如何拖放小部件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37280004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com