我在画布上有一张图片。用户可以在此图像上绘制一个矩形,然后图像将被裁剪并调整大小。 这是我的代码:
self._root = tk.Tk()
self._rect = None
image_cv2 = cv2.imread(path_image)
self._root.minsize(height=image_cv2.shape[0], width=image_cv2.shape[1] + 150)
self._root.title("Image")
image = cv2.cvtColor(image_cv2, cv2.COLOR_BGR2RGB)
image2 = Image.fromarray(image)
image = ImageTk.PhotoImage(image2)
canvas_2 = tk.Canvas( self._root, height=image_cv2.shape[0], width=image_cv2.shape[1])
canvas_2.grid(row=0, column=1)
canvas_2.image = image
self._image_can2 = canvas_2.create_image(0, 0, anchor='nw', image=image)
canvas_2.bind("<Button-1>", lambda event: self.__on_button_press__(event, canvas_2))
canvas_2.bind("<B1-Motion>", lambda event: self.__on_move_press__(event, canvas_2))
canvas_2.bind("<ButtonRelease-1>", lambda event: self.__on_button_release__(event, canvas_2, image2))
def __on_button_press__(self, event, canvas_img):
# save mouse drag start position and display a _rectangle
if self._rect is not None:
canvas_img.delete(self._rect)
self._start_x = event.x
self._start_y = event.y
self._rect = canvas_img.create_rectangle(self._start_x, self._start_y, self._start_x + 1, self._start_y + 1, fill="", outline="green", width=5)
def __on_move_press__(self, event, canvas_img):
# expand rectangle as you drag the mouse
curX = event.x
curY = event.y
canvas_img.coords(self._rect, self._start_x, self._start_y, curX, curY)
return True
def __on_button_release__(self, event, canvas_img, image):
# save mouse drag ststopart position and display a rectangle
if self._rect is not None:
if self._start_x > event.x or self._start_y > event.y:
canvas_img.delete(self._rect)
messagebox.showwarning('Error', 'You have to draw the rectangle from the top-left to the bottom-right')
self._stop_x = event.x
self._stop_y = event.y
self.__cropped_img__(canvas_img, image)
return True
def __cropped_img__(self, canvas_img, image):
# cropped the image according to the drawn rectangle
canvas_img.delete(self._rect)
image = image.crop([self._start_x, self._start_y, self._stop_x, self._stop_y]).resize((500, 500))
image = ImageTk.PhotoImage(image)
canvas_img.itemconfig(self._image_can2, image=image)
return True
已绘制矩形,但itemconfig不起作用:图像消失。
在函数 cropped_img 而不是return True
的末尾,我出现了类似return true
这样的错误,我得到了一个错误:
Tkinter回调中的异常
[...]
NameError:未定义名称“ true”
但是图像会被裁剪并调整大小。 我不明白为什么在没有错误的情况下它不起作用。
根据此链接:Why does Tkinter image not show up if created in a function?,我试图放
global image
在代码开头,我遇到了相同的错误。