【问题标题】:How to fix a widget in a grid row and column while the user is dragging it?如何在用户拖动时修复网格行和列中的小部件?
【发布时间】:2021-02-09 03:17:49
【问题描述】:

我想要一个被用户拖动的小部件在小部件靠近它时固定在特定的网格单元格中,有没有办法在 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 等)

【问题讨论】:

  • “固定在特定的网格单元中”相当模糊。它已经在网格单元格中了吗?如果不是,你怎么把它放在屏幕上?请提供minimal reproducible example
  • @BryanOakley 我已经编辑了我的问题,现在更清楚,请检查并帮助我

标签: python python-3.x tkinter grid widget


【解决方案1】:

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

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 像素范围内,它会将其剪辑到单元格中。这基本上是通过使用模 % 运算符将当前坐标除以单元格的高度/宽度并比较其是否在所需范围内来完成的。

【讨论】:

  • 非常感谢我正在寻找的东西!!!
猜你喜欢
  • 2018-09-12
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-03-22
  • 2021-06-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多