[英]How to make a tkinter canvas background transparent?
我正在制作一个国际象棋程序,我希望能够拖动棋子。 为了做到这一点,我将作品的图像放在Canvas
以便可以拖动它(如果需要,我也可以使用Label
)。 但是,当我拖动该作品时,该作品的图像周围会出现一个白色方块。
我在研究这个问题的时候,很多人给出了这样的解决方案:
drag_canvas = Canvas(self, height=80, width=80, bg="yellow")
root.wm_attributes("-transparentcolor", "yellow")
这导致背景透明,但不是可见的棋盘,而是 GUI 背后的程序
有什么办法可以让背景透明并显示后面的棋盘而不是 tkinter 窗口后面的程序?
注意:我不介意使用任何其他小部件(例如Label
),但它们必须使用 Python 默认的模块(因此没有 PIL),因为该程序需要在我无法下载其他模块的环境中使用。
问题:如何使 tkinter 画布背景透明?
唯一可能的config(...
选项,将背景设置为空
c.config(bg='')
结果为: _tkinter.TclError:未知颜色名称“”
要得到这个结果:
你必须在同一个.Canvas(...
.
self.canvas = Canvas(self, width=500, height=200, bd=0, highlightthickness=0)
self.canvas.create_rectangle(245,50,345,150, fill='white')
self.image = tk.PhotoImage(file='chess.png')
self.image_id = self.canvas.create_image(50,50, image=self.image)
self.canvas.move(self.image_id, 245, 100)
用 Python 测试:3.5 - TkVersion:8.6
仅适用于Windows 的解决方案是使用pywin32 模块,并且可以通过以下方式安装:
pip 安装 pywin32
使用 pywin32,您可以更改窗口样式并将画布设置为分层窗口。 分层窗口可以有一个透明的颜色键,如下例所示:
import tkinter as tk
import win32gui
import win32con
import win32api
root = tk.Tk()
root.configure(bg='yellow')
canvas = tk.Canvas(root,bg='#000000')#full black
hwnd = canvas.winfo_id()
colorkey = win32api.RGB(0,0,0) #full black in COLORREF structure
wnd_exstyle = win32gui.GetWindowLong(hwnd, win32con.GWL_EXSTYLE)
new_exstyle = wnd_exstyle | win32con.WS_EX_LAYERED
win32gui.SetWindowLong(hwnd,win32con.GWL_EXSTYLE,new_exstyle)
win32gui.SetLayeredWindowAttributes(hwnd,colorkey,255,win32con.LWA_COLORKEY)
canvas.create_rectangle(50,50,100,100,fill='blue')
canvas.pack()
说明:
首先,我们需要名为 hwnd 的窗口句柄,我们可以通过.winfo_id()
在.winfo_id()
获取它。
接下来我们通过GetWindowLong获取实际的扩展窗口样式,并通过win32con.GWL_EXSTYLE
询问具体的扩展样式信息。
之后,我们在十六进制中进行按位运算以使用wnd_exstyle | win32con.WS_EX_LAYERED
改变样式wnd_exstyle | win32con.WS_EX_LAYERED
wnd_exstyle | win32con.WS_EX_LAYERED
结果是我们的new_style
。
现在我们可以使用SetWindowLong将扩展样式设置为窗口。 最后,我们有了LayeredWindow ,它具有我们可以使用的附加属性。 透明的 ColorKey 可以使用SetLayeredWindowAttributes
设置,而我们只使用LWA_COLORKEY
alpha 参数对我们没有用。
注意:定义透明色键后,该画布中具有该颜色的所有内容都将是透明的!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.