Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 当用户拖动控件时,如何修复网格行和列中的控件?_Python_Python 3.x_Tkinter_Grid_Widget - Fatal编程技术网

Python 当用户拖动控件时,如何修复网格行和列中的控件?

Python 当用户拖动控件时,如何修复网格行和列中的控件?,python,python-3.x,tkinter,grid,widget,Python,Python 3.x,Tkinter,Grid,Widget,我想要一个被用户拖拽的小部件,当小部件靠近它时,它被固定在一个特定的网格单元中,有没有办法在tkinter中实现它?我设法通过在用户拖动小部件时使用鼠标的位置来拖动小部件,但我不知道如何将其固定到网格单元中 这就是我目前用来移动小部件的东西 def make_draggable(self): def drag_start(event): widget = self widget = event.widget

我想要一个被用户拖拽的小部件,当小部件靠近它时,它被固定在一个特定的网格单元中,有没有办法在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)
def可拖动(自):
def拖放启动(事件):
widget=self
widget=event.widget
self.\u drag\u start\u x=event.x
self.\u drag\u start\u y=event.y
def拖曳运动(事件):
widget=self
widget=event.widget
x=self.winfo\u x()-self.\u拖动\u开始\u x+事件.x
y=self.winfo\u y()-self.\u拖动\u开始\u y+event.y
自身位置(x=x,y=y)
self.bind(“,拖动\u开始)
self.bind(“,拖动运动)

例如,如果网格单元格左上角的位置为(x=10,y=10),当其位置接近该值(如9,9 8,8,9,5等)时,我需要在单元格中固定该按钮。

根据我从您的问题中了解的情况,我尝试了以下方法

从tkinter导入*
类拖动:
定义初始化(自我,小部件):
self.widget=widget
self.widget.bind(“,self.drag\u start)
self.widget.bind(“,self.drag\u motion)
self.grid=(100100)
自身保证金=(20,20)
def拖放启动(自身、事件):
self.\u drag\u start\u x=event.x
self.\u drag\u start\u y=event.y
def拖曳运动(自身、事件):
x=self.widget.winfo\u x()-self.\u拖动\u开始\u x+事件.x
y=self.widget.winfo\u y()-self.\u拖动\u开始\u y+事件.y
如果(
范围内的x%自网格[0](自余量[0]),以及
y%self.grid[1]在范围内(self.margin[1])
):
self.widget.place(x=x-x%self.grid[0],y=y-y%self.grid[1])
其他:
self.widget.place(x=x,y=y)
root=Tk()
root.minsize(300200)
label=label(根,text='Drag Me',bg='yellow')
label.pack()
拖动(标签)
root.mainloop()

这基本上创建了高度和宽度为
100
的“单元格”网格,如果单元格位于单元格左上角的
20
像素范围内,则将其剪辑到单元格中。这基本上是通过使用modulo
%
运算符将当前坐标的剩余部分除以单元格的高度/宽度,然后比较其是否在所需范围内来完成的。

根据我从您的问题中了解的情况,我尝试了以下方法

从tkinter导入*
类拖动:
定义初始化(自我,小部件):
self.widget=widget
self.widget.bind(“,self.drag\u start)
self.widget.bind(“,self.drag\u motion)
self.grid=(100100)
自身保证金=(20,20)
def拖放启动(自身、事件):
self.\u drag\u start\u x=event.x
self.\u drag\u start\u y=event.y
def拖曳运动(自身、事件):
x=self.widget.winfo\u x()-self.\u拖动\u开始\u x+事件.x
y=self.widget.winfo\u y()-self.\u拖动\u开始\u y+事件.y
如果(
范围内的x%自网格[0](自余量[0]),以及
y%self.grid[1]在范围内(self.margin[1])
):
self.widget.place(x=x-x%self.grid[0],y=y-y%self.grid[1])
其他:
self.widget.place(x=x,y=y)
root=Tk()
root.minsize(300200)
label=label(根,text='Drag Me',bg='yellow')
label.pack()
拖动(标签)
root.mainloop()

这基本上创建了高度和宽度为
100
的“单元格”网格,如果单元格位于单元格左上角的
20
像素范围内,则将其剪辑到单元格中。这基本上是通过使用modulo
%
运算符将当前坐标的剩余部分除以单元格的高度/宽度,并比较其是否在所需范围内来实现的。

“固定在特定网格单元格中”相当模糊。它已经在网格单元中了吗?如果没有,您如何将其显示在屏幕上?请提供一个。@BryanOakley我已经编辑了我的问题,现在更清楚了,请检查它并帮助我解决“固定在特定网格单元中”这一模糊问题。它已经在网格单元中了吗?如果没有,您如何将其显示在屏幕上?请提供一个。@BryanOakley我已经编辑了我的问题,现在更清楚了,请检查它并帮助我解决问题。非常感谢你,这正是我想要的!!!非常感谢你,这正是我想要的!!!