簡體   English   中英

如何在用戶拖動時修復網格行和列中的小部件?

[英]How to fix a widget in a grid row and column while the user is dragging it?

我想要一個被用戶拖動的小部件在小部件靠近它時固定在特定的網格單元中,有沒有辦法在 tkinter 中做到這一點? 我設法通過在用戶拖動小部件時使用鼠標 position 使小部件可拖動,但我不知道如何將其固定到網格單元中。

這是我目前用來移動小部件的

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)

例如,如果網格單元格左上角 position 是 (x=10,y=10) 當 position 接近該值(如 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像素范圍內,則將其剪輯到單元格中。 這基本上是通過使用模%運算符將當前坐標除以單元格的高度/寬度並比較其是否在所需范圍內來完成的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM