繁体   English   中英

如何使 tkinter 画布背景透明?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM