具有透明图像的可拖动Tkinter标签仍覆盖父画布中的图像

时间:2018-01-18 18:10:58

标签: python tkinter tkinter-canvas

我正在努力在背景图片上添加可拖动标签,其中标签是具有透明背景的图像。用于标签的图像本身是透明的,但Label本身相对于其父画布不透明。由于标签是可拖动的,因此我无法轻松地将父图像用于标签,并将透明图像粘贴到顶部。

This is an image of my problem.

龙是一个可拖动的标签,背景透明,但你看到标签本身不透明,并且覆盖画布图像。

龙图像本身具有透明背景,因为正常背景为蓝色,所以我知道问题在于标签透明度。

所需的行为是允许标签透明,因此当标签上的图像是透明的时,标签应显示在下面的图像中。

这是一个最小的例子:

from PIL import Image, ImageTk
import numpy as np
import tkinter as tk

#Creates a blue square with a transparent border
blue_square_transparent_border = [[[0,0,0,0]]*100]*10 + [[[0,0,0,0]]*30 + [[0,0,255,255]]*40 + [[0,0,0,0]]*30]*40 + [[[0,0,0,0]]*100]*10
blue_square_transparent_border = np.array(blue_square_transparent_border, dtype='uint8')
#convert numpy array to PIL image
pil_image = Image.fromarray(blue_square_transparent_border)

root = tk.Tk()
root.configure(background='red')
#convert PIL image to tkinter image
tk_image = ImageTk.PhotoImage(pil_image)
#create label
image_label = tk.Label(root, image=tk_image)
image_label.pack()
root.mainloop()

我希望看到的是一个蓝色正方形,红色背景,没有边框。在上面的例子中,灰色的边框出现,因为它是通过透明图像看到的标签;调整窗口大小时很容易看到这个。我怀疑标签是否透明,这可以解决我的问题。

任何帮助都会很棒,谢谢!

1 个答案:

答案 0 :(得分:1)

如果要在背景图像上拖动部分透明图像(如龙),可以使用Canvas

我们的想法不是使用标签,而是使用create_image的{​​{1}}方法。 首先,使用Canvas显示背景图像,然后显示标记为“可拖动”的所有可拖动图像:canvas.create_image(0, 0, image=background_image, anchor='nw')。最后,将标签'draggable'绑定到鼠标事件。

以下是一个例子:

canvas.create_image(x, y, image=draggable_image, anchor='nw', tag='draggable')