python-3.x 如何使tkinter画布背景透明?

lf5gs5x2  于 2023-05-02  发布在  Python
关注(0)|答案(3)|浏览(193)

我正在做一个国际象棋程序,我希望能够拖动棋子。为了做到这一点,我把作品的图像放在一个Canvas上,这样它就可以被拖动(如果我愿意,我也可以使用一个Label)。然而,当我拖动该块时,有一个白色的正方形包围着该块的图像。

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

drag_canvas = Canvas(self, height=80, width=80, bg="yellow")
root.wm_attributes("-transparentcolor", "yellow")

这导致背景是透明的,但它不是棋盘是可见的,这是程序背后的图形用户界面



有没有什么方法可以让背景透明,显示棋盘后面,而不是tkinter窗口后面的程序?
注:我不介意使用任何其他小部件(e。a Label),但它们必须使用Python默认的模块(所以没有PIL),因为这个程序需要在我无法下载其他模块的环境中使用。

jm2pwxwz

jm2pwxwz1#

问题:如何使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 -Tk版本:8.6

dldeef67

dldeef672#

一个仅限windows的解决方案是使用pywin32模块,该模块可以通过以下方式安装:
pip install pywin32
使用pywin32,你可以改变窗口的exstyle,并将画布设置为分层窗口。分层窗口可以有一个透明的colorkey,并在下面的示例中完成:

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()

说明:

首先,我们需要handle of the window,它被称为hwnd,我们可以通过.winfo_id()在tkinter中获得它。
接下来,我们通过GetWindowLong获得实际的extended window style,并通过win32con.GWL_EXSTYLE询问特定的扩展样式信息。
之后,我们在十六进制中执行一个按位操作,以改变wnd_exstyle | win32con.WS_EX_LAYERED的样式,结果是我们的new_style
现在我们可以使用SetWindowLong为窗口设置扩展样式。最后,我们有我们的LayeredWindow,它有我们可以使用的其他属性。一个透明的ColorKey可以用SetLayeredWindowAttributes设置,而我们只使用LWA_COLORKEY,alpha参数对我们没有用处。

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

gorkyyrv

gorkyyrv3#

这对Tkinter来说是不可能的。

相关问题