如何在用户拖动时将小部件固定在网格行和列中?
How to fix a widget in a grid row and column while the user is dragging it?
我想要一个被用户拖动的小部件在靠近它时固定在特定的网格单元格中,有没有办法在 tkinter 中做到这一点?我设法通过在用户拖动小部件时获取用户的鼠标位置来使小部件可拖动,但我不知道如何将其固定到网格单元格中。
这是我目前用来移动小部件的方法
def make_draggable(self):
def drag_start(event):
widget = self
widget = event.widget
self._drag_start_x = event.x
self._drag_start_y = event.y
def drag_motion(event):
widget = self
widget = event.widget
x = self.winfo_x() - self._drag_start_x + event.x
y = self.winfo_y() - self._drag_start_y + event.y
self.place(x=x, y=y)
self.bind("<Button-1>", drag_start)
self.bind("<B1-Motion>", drag_motion)
例如,如果网格单元格的左上角位置是 (x=10,y=10),我需要按钮在其位置接近该值时固定在单元格中(例如 9,9 8, 8 9,5 等)
根据我从你的问题中了解到的情况,我尝试了以下方法
from tkinter import *
class Drag:
def __init__(self,widget):
self.widget=widget
self.widget.bind("<Button-1>", self.drag_start)
self.widget.bind("<B1-Motion>", self.drag_motion)
self.grid=(100,100)
self.margin=(20,20)
def drag_start(self,event):
self._drag_start_x = event.x
self._drag_start_y = event.y
def drag_motion(self,event):
x = self.widget.winfo_x() - self._drag_start_x + event.x
y = self.widget.winfo_y() - self._drag_start_y + event.y
if (
x%self.grid[0] in range(self.margin[0]) and
y%self.grid[1] in range(self.margin[1])
):
self.widget.place(x=x-x%self.grid[0],y=y-y%self.grid[1])
else:
self.widget.place(x=x, y=y)
root=Tk()
root.minsize(300,200)
label=Label(root,text='Drag Me',bg='yellow')
label.pack()
Drag(label)
root.mainloop()
这基本上创建了高度和宽度为 100
的“单元格”网格,如果它在单元格左上角的 20
像素范围内,它会将其剪辑到单元格。这基本上是通过使用模 %
运算符将当前坐标除以单元格 height/width 的余数并比较它是否在所需范围内来完成的。
我想要一个被用户拖动的小部件在靠近它时固定在特定的网格单元格中,有没有办法在 tkinter 中做到这一点?我设法通过在用户拖动小部件时获取用户的鼠标位置来使小部件可拖动,但我不知道如何将其固定到网格单元格中。
这是我目前用来移动小部件的方法
def make_draggable(self):
def drag_start(event):
widget = self
widget = event.widget
self._drag_start_x = event.x
self._drag_start_y = event.y
def drag_motion(event):
widget = self
widget = event.widget
x = self.winfo_x() - self._drag_start_x + event.x
y = self.winfo_y() - self._drag_start_y + event.y
self.place(x=x, y=y)
self.bind("<Button-1>", drag_start)
self.bind("<B1-Motion>", drag_motion)
例如,如果网格单元格的左上角位置是 (x=10,y=10),我需要按钮在其位置接近该值时固定在单元格中(例如 9,9 8, 8 9,5 等)
根据我从你的问题中了解到的情况,我尝试了以下方法
from tkinter import *
class Drag:
def __init__(self,widget):
self.widget=widget
self.widget.bind("<Button-1>", self.drag_start)
self.widget.bind("<B1-Motion>", self.drag_motion)
self.grid=(100,100)
self.margin=(20,20)
def drag_start(self,event):
self._drag_start_x = event.x
self._drag_start_y = event.y
def drag_motion(self,event):
x = self.widget.winfo_x() - self._drag_start_x + event.x
y = self.widget.winfo_y() - self._drag_start_y + event.y
if (
x%self.grid[0] in range(self.margin[0]) and
y%self.grid[1] in range(self.margin[1])
):
self.widget.place(x=x-x%self.grid[0],y=y-y%self.grid[1])
else:
self.widget.place(x=x, y=y)
root=Tk()
root.minsize(300,200)
label=Label(root,text='Drag Me',bg='yellow')
label.pack()
Drag(label)
root.mainloop()
这基本上创建了高度和宽度为 100
的“单元格”网格,如果它在单元格左上角的 20
像素范围内,它会将其剪辑到单元格。这基本上是通过使用模 %
运算符将当前坐标除以单元格 height/width 的余数并比较它是否在所需范围内来完成的。