想要使用 Tkinter 通过光标调整形状(矩形)的大小
Want to resize shapes(Rectangle) by cursor using Tkinter
我成功地用鼠标绘制了矩形,但无法调整它的大小。
我通过调用函数尝试了多种使用事件的方法,但都失败了。
python 的新手如此挣扎。
谢谢
很少有错误 self.current = self.create_rectangle(*self.start, *self.start, width=5)
应该是 self.canvas.create_rectangle(*self.start, *self.start, width=5)
同样self.tag_bind
应该是self.canvas.tag_bind
从 openFile
方法中删除 self.canvas.bind("<B1-Motion>", self.on_click)
和 self.__init__(filename)
此外,不要忘记导入部分 (from functools import partial
)
您可以在 self.canvas
上绑定的回调上调整大小,不需要在矩形项上绑定。
下面是一个简化的例子:
import tkinter as tk
class ExampleApp(tk.Tk):
def __init__(self):
super().__init__()
self.canvas = tk.Canvas(self, width=512, height=512, cursor="cross")
self.canvas.pack(fill="both", expand=1)
self.canvas.bind("<Button-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_move_press)
def on_button_press(self, event):
# find rectangle items under mouse cursor
items = [x for x in self.canvas.find_withtag("current") if self.canvas.type(x) == "rectangle"]
if items:
# item found, use it as the "current" item
self.start = self.canvas.coords(items[0])[:2]
self.current = items[0]
else:
# no item found, create new "current" rectangle item
self.start = event.x, event.y
self.current = self.canvas.create_rectangle(*self.start, *self.start, width=5)
def on_move_press(self, event):
# resize the "current" item
self.canvas.coords(self.current, *self.start, event.x, event.y)
ExampleApp().mainloop()
我成功地用鼠标绘制了矩形,但无法调整它的大小。 我通过调用函数尝试了多种使用事件的方法,但都失败了。
python 的新手如此挣扎。
谢谢
很少有错误 self.current = self.create_rectangle(*self.start, *self.start, width=5)
应该是 self.canvas.create_rectangle(*self.start, *self.start, width=5)
同样self.tag_bind
应该是self.canvas.tag_bind
从 openFile
方法中删除 self.canvas.bind("<B1-Motion>", self.on_click)
和 self.__init__(filename)
此外,不要忘记导入部分 (from functools import partial
)
您可以在 self.canvas
上绑定的回调上调整大小,不需要在矩形项上绑定。
下面是一个简化的例子:
import tkinter as tk
class ExampleApp(tk.Tk):
def __init__(self):
super().__init__()
self.canvas = tk.Canvas(self, width=512, height=512, cursor="cross")
self.canvas.pack(fill="both", expand=1)
self.canvas.bind("<Button-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_move_press)
def on_button_press(self, event):
# find rectangle items under mouse cursor
items = [x for x in self.canvas.find_withtag("current") if self.canvas.type(x) == "rectangle"]
if items:
# item found, use it as the "current" item
self.start = self.canvas.coords(items[0])[:2]
self.current = items[0]
else:
# no item found, create new "current" rectangle item
self.start = event.x, event.y
self.current = self.canvas.create_rectangle(*self.start, *self.start, width=5)
def on_move_press(self, event):
# resize the "current" item
self.canvas.coords(self.current, *self.start, event.x, event.y)
ExampleApp().mainloop()