gpt4 book ai didi

python - 在自定义像素网格上移动 Canvas 上的矩形

转载 作者:行者123 更新时间:2023-12-01 01:25:07 24 4
gpt4 key购买 nike

我编写这段代码是为了练习,它会在按下鼠标左键时移动我的标签:

def motion(self, event):
delta_x = event.x - self._drag_data["x"]
delta_y = event.y - self._drag_data["y"]

self.canvas.move(self._drag_data["item"], delta_x, delta_y)

self._drag_data["x"] = event.x
self._drag_data["y"] = event.y

接下来,我尝试在定义的网格(假设为 5 个像素)上移动标签。因此,将标签直接“扣”在一起会更容易。

我该怎么做?有没有办法每 5 个像素移动标签一次?因此,每 5 个像素,标签就会再次在光标下方跳转。

这是我发现的提取函数的示例:

import tkinter as tk

class Example(tk.Frame):

def __init__(self, parent):
tk.Frame.__init__(self, parent)

self.canvas = tk.Canvas(width=400, height=400)
self.canvas.pack(fill="both", expand=True)

self._drag_data = {"x": 0, "y": 0, "item": None}

self._create_token((100, 100), "white")

self.canvas.tag_bind("token", "<ButtonPress-1>", self.on_token_press)
self.canvas.tag_bind("token", "<ButtonRelease-1>", self.on_token_release)
self.canvas.tag_bind("token", "<B1-Motion>", self.on_token_motion)

def _create_token(self, coord, color):
(x,y) = coord
self.canvas.create_oval(x-25, y-25, x+25, y+25, outline=color, fill=color, tags="token")

def on_token_press(self, event):
self._drag_data["item"] = self.canvas.find_closest(event.x, event.y)[0]
self._drag_data["x"] = event.x
self._drag_data["y"] = event.y

def on_token_release(self, event):
self._drag_data["item"] = None
self._drag_data["x"] = 0
self._drag_data["y"] = 0

def on_token_motion(self, event):
delta_x = event.x - self._drag_data["x"]
delta_y = event.y - self._drag_data["y"]
self.canvas.move(self._drag_data["item"], delta_x, delta_y)
self._drag_data["x"] = event.x
self._drag_data["y"] = event.y

if __name__ == "__main__":
root = tk.Tk()
Example(root).pack(fill="both", expand=True)
root.mainloop()

最佳答案

这里我们将 x 和 y 的 delta 设置为 5,然后检查鼠标位置是否在我们的项目后面/下方,如果是,我们将 x 或 y 乘以 -1 以使 delta 为负,这样我们的项目就会朝我们的鼠标。

def motion(self, event):
delta_x = 0
delta_y = 0
step = 5

if abs(event.x - self._drag_data["x"]) >= step:
delta_x = step
if abs(event.y - self._drag_data["y"]) >= step:
delta_y = step

if event.x < self._drag_data["x"]:
delta_x *= -1
if event.y < self._drag_data["y"]:
delta_y *= -1

self.canvas.move(self._drag_data["item"], delta_x, delta_y)

if delta_x != 0:
self._drag_data["x"] = event.x
if delta_y != 0:
self._drag_data["y"] = event.y

关于python - 在自定义像素网格上移动 Canvas 上的矩形,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53437249/

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