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),因为该程序需要在我无法下载其他模块的环境中使用。
问题:如何使 tkinter 画布背景透明?
唯一可能的config(...选项,将背景设置为空
Run Code Online (Sandbox Code Playgroud)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)
Run Code Online (Sandbox Code Playgroud)
用 Python 测试:3.5 - TkVersion:8.6
仅适用于 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 参数对我们来说没有用。
重要提示:定义透明色键后,画布中具有该颜色的所有内容都将是透明的。
| 归档时间: |
|
| 查看次数: |
16553 次 |
| 最近记录: |