全部
这是我第一次使用Tkinter。
我的工作是加载图像,在对象上绘制边界框,并为它们提供正确的标签,如下所示:
这是我的代码
class ExampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.x = 0
self.y = 0
self.img = ImageTk.PhotoImage(file = "0.png")
self.canvas = tk.Canvas(self, width=1080, height=720)
self.canvas.create_image(20, 20, anchor=NW, image=self.img)
self.canvas.pack()
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_move_press)
self.canvas.bind("<Motion>", self.moving)
self.start_x = None
self.start_y = None
self.rect = None
def right_click(self, event):
self.canvas.delete(self.canvas.find_closest(event.x, event.y))
def moving(self, event):
all_item = self.canvas.find_all()
for i in all_item[1:]:
for i in all_item:
self.canvas.itemconfig(i, width=2.0, outline='red')
target = self.canvas.find_closest(event.x, event.y)[0]
self.canvas.itemconfig(target, width=4.0, outline='yellow')
def on_button_press(self, event):
self.start_x = event.x
self.start_y = event.y
self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, width=2.0, outline='red')
def on_move_press(self, event):
curX, curY = (event.x, event.y)
self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)
def on_button_release(self, event):
pass
if __name__ == "__main__":
app = ExampleApp()
app.mainloop()
我想要的是当我将鼠标内部移动到矩形时,它会变成黄色。
问题是,只有当鼠标完全位于矩形边缘时,矩形才会变成黄色。
因为背景图片也是画布项目之一,所以find_closest函数将始终是
当鼠标不在矩形边缘时返回图片。
任何人都有更好的主意?
对于实心矩形,您只需要
create_rectangle(..., activeoutline="yellow")
没有usinig函数moving()
。
对于空矩形,您必须获取所有矩形并使用canvas.bbox(id)
获取矩形(x1,y1,x2,y2)
使用的区域并与event.x, event.y
比较
仅检查矩形,我在矩形中添加了标签
self.canvas.create_rectangle(..., tag='rect')
后来我只能用]获得矩形>
all_rect = self.canvas.find_withtag('rect')
def moving(self, event): all_rect = self.canvas.find_withtag('rect') x = event.x y = event.y for i in all_rect: x1, y1, x2, y2 = self.canvas.bbox(i) if x1 <= x <= x2 and y1 <= y <= y2: self.canvas.itemconfig(i, width=4.0, outline='yellow') else: self.canvas.itemconfig(i, width=2.0, outline='red')
最终代替使用
find_withtag()
和bbox()
,您可以使用列表保留
(rect_id, (x1,y1,x2,y3), text_id)
并在
moving()
中使用它来查找rect,然后您也可以在rect中更改文本。
完整示例代码。
我添加了重叠的矩形以测试它是否会改变两个矩形的颜色。
import tkinter as tk
from PIL import ImageTk
class ExampleApp(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
self.x = 0
self.y = 0
self.img = ImageTk.PhotoImage(file="image.jpg")
self.canvas = tk.Canvas(self, width=1080, height=720)
self.canvas.pack()
self.canvas.bind("<ButtonPress-1>", self.on_button_press)
self.canvas.bind("<B1-Motion>", self.on_move_press)
self.canvas.bind("<Motion>", self.moving)
self.canvas.create_image(20, 20, anchor='nw', image=self.img)
self.canvas.create_rectangle(50, 50, 100, 100, width=2.0, outline='red', tag='rect')
self.canvas.create_rectangle(200, 200, 250, 250, width=2.0, outline='red', tag='rect')
self.canvas.create_rectangle(75, 75, 225, 225, width=2.0, outline='red', tag='rect')
self.start_x = None
self.start_y = None
self.rect = None
def right_click(self, event):
self.canvas.delete(self.canvas.find_closest(event.x, event.y))
def moving(self, event):
all_rect = self.canvas.find_withtag('rect')
x = event.x
y = event.y
for i in all_rect:
x1, y1, x2, y2 = self.canvas.bbox(i)
if x1 <= x <= x2 and y1 <= y <= y2:
self.canvas.itemconfig(i, width=4.0, outline='yellow')
else:
self.canvas.itemconfig(i, width=2.0, outline='red')
def on_button_press(self, event):
self.start_x = event.x
self.start_y = event.y
self.rect = self.canvas.create_rectangle(self.x, self.y, 1, 1, width=2.0, outline='red')
def on_move_press(self, event):
curX, curY = (event.x, event.y)
self.canvas.coords(self.rect, self.start_x, self.start_y, curX, curY)
def on_button_release(self, event):
pass
if __name__ == "__main__":
app = ExampleApp()
app.mainloop()