来自@thingamabobs的仅适用于Windows的解决方案也可以通过Python自带的windll
进行操作(在Surface Pro 8上是3.11版本,Win11系统)。
我将其转换为一个函数:
import tkinter as tk
from ctypes import windll
def maketransparent(w):
colorkey = 0x00030201
hwnd = w.winfo_id()
wnd_exstyle = windll.user32.GetWindowLongA(hwnd, -20)
new_exstyle = wnd_exstyle | 0x00080000
windll.user32.SetWindowLongA(hwnd, -20, new_exstyle)
windll.user32.SetLayeredWindowAttributes(hwnd, colorkey, 255, 0x00000001)
win=tk.Tk()
win.geometry('400x200')
win.grid_rowconfigure(0,weight=1)
win.grid_columnconfigure(0,weight=1)
cvs_lower=tk.Canvas(win, background='lightgreen')
cvs_lower.create_rectangle(50, 50, 350, 150, fill='blue')
cvs_lower.grid(row=0, column=0, sticky='nesw')
cvs_upper=tk.Canvas(win, background='#010203')
cvs_upper.create_rectangle(325, 25, 375, 175, fill='red')
cvs_upper.grid(row=0, column=0, sticky='nesw')
btn=tk.Button(cvs_upper, text='plop', foreground='#010203', font='Arial 30')
btn.pack(side='right')
win.after(2000, lambda:maketransparent(cvs_upper))
win.mainloop()
对于您来说,如果可拖动的画布变为透明,它的白色背景将消失。也就是说,当棋子是一个填充了白色(或黑色...)形状的画布,并且背景为
colorkey
时,背景将消失... 正如下面的两个画布所示。
只是为了完整起见,我注意到Canvas
cvs_upper
的任何子元素中具有透明颜色
colorkey
的部分,即使画布本身可能有绘图并且不透明(例如下面图片中的红色条),也会变为透明。
这通过第二个画布上的一个按钮来说明,其文本显示为
colorkey
颜色。
在窗口变为透明之前,我们看到的是这样的:
![before the upper canvas is transparent](https://istack.dev59.com/1yTPe.webp)
画布很暗(#010203非常暗!),按钮文本与相同颜色。一秒钟后,上层画布变为透明。
![After the upper canvas is made transparent](https://istack.dev59.com/HHyp7.webp)
您可以看到画布和按钮文本现在是透明的,我们可以看到它下面的第一个画布。我们看不到按钮下面的红色条!
.Canvas(...
?[编辑]你的问题并添加有关图像格式的信息。 - stovflCanvas
,因为根据stackoverflow上类似的帖子,我认为这是最好的方法。因此,如果有一种不使用Canvas
就可以实现这一点的方法,我会非常乐意使用它。 - Anonymous Coder