如何使 tkinter 画布背景透明?

Mil*_*Tom 8 python canvas tkinter transparent python-3.x

我正在制作一个国际象棋程序,我希望能够拖动棋子。为了做到这一点,我将作品的图像放在 a 上,Canvas以便可以拖动它(Label如果需要,我也可以使用 a )。但是,当我拖动该作品时,该作品的图像周围会出现一个白色方块。

在此处输入图片说明

我在研究这个问题的时候,很多人给出了这样的解决方案:

drag_canvas = Canvas(self, height=80, width=80, bg="yellow")
root.wm_attributes("-transparentcolor", "yellow")
Run Code Online (Sandbox Code Playgroud)

这导致背景透明但不是可见的棋盘,而是 GUI 后面的程序

在此处输入图片说明.

有什么办法可以让背景透明并显示后面的棋盘而不是 tkinter 窗口后面的程序?

注意:我不介意使用任何其他小部件(例如 a Label),但它们必须使用 Python 的默认模块(因此没有 PIL),因为该程序需要在我无法下载其他模块的环境中使用。

sto*_*vfl 6

问题:如何使 tkinter 画布背景透明?

唯一可能的config(...选项,将背景设置为空

c.config(bg='')
Run Code Online (Sandbox Code Playgroud)

结果为:_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)
Run Code Online (Sandbox Code Playgroud)

用 Python 测试:3.5 - TkVersion:8.6

  • 抱歉,问题是如何获得透明画布。您给出了解决办法,告诉将图像放在同一个画布上。这如何回答这个问题?就我而言,我需要将图像和背景放在不同的画布上。 (3认同)

Atl*_*435 5

仅适用于 Windows 的解决方案是使用pywin32可以安装的模块:

pip install pywin32

pywin32可以更改窗口 exstyle 并将画布设置为分层窗口。分层窗口可以具有透明的色键,并在下面的示例中完成:

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()
Run Code Online (Sandbox Code Playgroud)

说明:

首先我们需要窗口的句柄,称为 hwnd,我们可以在 tkinter 中通过 获取它.winfo_id()

接下来,我们通过GetWindowLong获取实际的扩展窗口样式,并使用 询问特定的扩展样式信息。win32con.GWL_EXSTYLE

之后,我们以十六进制进行按位运算来更改样式,wnd_exstyle | win32con.WS_EX_LAYERED结果就是我们的new_style.

现在我们可以使用SetWindowLong设置窗口的扩展样式。最后我们有了LayeredWindow,它有我们可以使用的附加属性。可以设置透明的 ColorKey,SetLayeredWindowAttributes而我们只使用LWA_COLORKEYalpha 参数对我们来说没有用。

重要提示:定义透明色键后,画布中具有该颜色的所有内容都将是透明的。

在此输入图像描述