我正在做一个国际象棋程序,我希望能够拖动棋子。为了做到这一点,我把作品的图像放在一个Canvas
上,这样它就可以被拖动(如果我愿意,我也可以使用一个Label
)。然而,当我拖动该块时,有一个白色的正方形包围着该块的图像。
当我研究这个问题时,很多人给出了这样的解决方案:
drag_canvas = Canvas(self, height=80, width=80, bg="yellow")
root.wm_attributes("-transparentcolor", "yellow")
这导致背景是透明的,但它不是棋盘是可见的,这是程序背后的图形用户界面
。
有没有什么方法可以让背景透明,显示棋盘后面,而不是tkinter窗口后面的程序?
注:我不介意使用任何其他小部件(e。a Label
),但它们必须使用Python默认的模块(所以没有PIL),因为这个程序需要在我无法下载其他模块的环境中使用。
3条答案
按热度按时间jm2pwxwz1#
问题:如何使tkinter画布背景透明?
唯一可能的
config(...
选项,将背景设置为无结果:_tkinter.TclError:未知的颜色名称“"
要获得此结果:
你必须把棋盘和数字放在同一个
.Canvas(...
范围内。使用Python测试:3.5 -Tk版本:8.6
dldeef672#
一个仅限windows的解决方案是使用
pywin32
模块,该模块可以通过以下方式安装:pip install pywin32
使用
pywin32
,你可以改变窗口的exstyle,并将画布设置为分层窗口。分层窗口可以有一个透明的colorkey,并在下面的示例中完成:说明:
首先,我们需要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参数对我们没有用处。**重要提示:**定义透明色键后,画布中具有该颜色的所有内容都将透明。
gorkyyrv3#
这对Tkinter来说是不可能的。