Tkinter回调中的itemconfig和Exception

发布时间:2020-07-06 16:10

我在画布上有一张图片。用户可以在此图像上绘制一个矩形,然后图像将被裁剪并调整大小。 这是我的代码:

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

在代码开头,我遇到了相同的错误。

回答1