我正在Tkinter(Python 3.7)中创建一个仪表板,并一直试图将图像放置在其他小部件之上以增强其外观。问题是,每次我放置图像时,它都会在背景中结束。理想情况下,我希望将透明的图像放置在面板中的所有小部件上,但是我只希望能够将非透明的图像放置在显示器的一部分上。 我一直在使用place()来定位我的小部件,因为我从不希望小部件移动,而只需要它在特定的屏幕分辨率下工作即可。 到目前为止,我已经尝试过使用PIL包,并尝试将图像放置在标签和画布中,但是两者似乎具有相同的结果。即使我将小部件与图像一起放在画布中,这些小部件也会显示在前面。 这是一个简单的示例:
import tkinter as tk
import PIL.Image
import PIL.ImageTk
root = tk.Tk()
image = PIL.Image.open('esis/decals_green.gif')
photo = PIL.ImageTk.PhotoImage(image)
label = tk.Label(root, image=photo)
label.image = photo #keep reference
sampleWidget = tk.Button(root, text='Test')
sampleWidget.place(x=0, y=0, height=100, width=100)
label.place(x=0, y=0, height=200, width=200)
root.mainloop()
即使我将图像标签放在最后,它也会显示在按钮下方。
答案 0 :(得分:1)
当tkinter小部件重叠时,tkinter将使用堆叠顺序(有时称为z-index)来确定哪个小部件可以覆盖其他小部件。
堆叠顺序默认为小部件的创建顺序(先前创建的小部件的顺序低于后来创建的小部件的顺序)。您可以使用lower
和lift
方法更改此顺序。因为您是最后创建按钮小部件的,所以它在堆叠顺序中的位置较高,因此将出现在图像的顶部。
如果直到所有其他小部件都创建完毕后才等待使用图像创建标签,则标签的堆叠顺序将最高,因此将出现在所有其他小部件的顶部。您也可以按原样保留代码,并在代码末尾添加label.lift()
,以将其提升到堆叠顺序的顶部。