tkinter 叠加窗口实现部分位置透明
时间: 2023-07-13 15:23:38 浏览: 170
在 Tkinter 中,可以使用 Toplevel 窗口来实现叠加窗口的效果。要实现部分位置透明,可以使用 PIL 库中的 ImageTk 和 ImageDraw 模块来绘制透明的图片,并将其作为 Toplevel 窗口的背景。
具体步骤如下:
1. 导入 Tkinter 和 PIL 库
```python
import tkinter as tk
from PIL import ImageTk, ImageDraw, Image
```
2. 创建主窗口和 Toplevel 窗口
```python
root = tk.Tk()
root.geometry("400x400")
top = tk.Toplevel(root)
top.geometry("200x200")
```
3. 绘制透明的图片
```python
alpha = 128 # 设置透明度,范围为 0~255
size = (200, 200) # 设置图片的大小
# 创建一个 RGBA 模式的图片,并将所有像素设置为透明
image = Image.new("RGBA", size, (0, 0, 0, 0))
# 在图片上绘制一个矩形,表示要设置为透明的区域
draw = ImageDraw.Draw(image)
draw.rectangle((50, 50, 150, 150), fill=(0, 0, 0, alpha))
```
4. 将图片转换为 Tkinter 支持的格式,并作为 Toplevel 窗口的背景
```python
# 将图片转换为 PhotoImage 格式
photo = ImageTk.PhotoImage(image)
# 设置 Toplevel 窗口的背景为透明图片
top.config(background="systemTransparent")
top.attributes("-transparentcolor", "systemTransparent") # 设置 Toplevel 窗口为透明
canvas = tk.Canvas(top, width=size[0], height=size[1], highlightthickness=0)
canvas.pack()
canvas.create_image(0, 0, image=photo, anchor="nw")
```
这样就可以实现部分位置透明的叠加窗口效果了。完整代码如下:
```python
import tkinter as tk
from PIL import ImageTk, ImageDraw, Image
root = tk.Tk()
root.geometry("400x400")
top = tk.Toplevel(root)
top.geometry("200x200")
alpha = 128 # 设置透明度,范围为 0~255
size = (200, 200) # 设置图片的大小
# 创建一个 RGBA 模式的图片,并将所有像素设置为透明
image = Image.new("RGBA", size, (0, 0, 0, 0))
# 在图片上绘制一个矩形,表示要设置为透明的区域
draw = ImageDraw.Draw(image)
draw.rectangle((50, 50, 150, 150), fill=(0, 0, 0, alpha))
# 将图片转换为 PhotoImage 格式
photo = ImageTk.PhotoImage(image)
# 设置 Toplevel 窗口的背景为透明图片
top.config(background="systemTransparent")
top.attributes("-transparentcolor", "systemTransparent") # 设置 Toplevel 窗口为透明
canvas = tk.Canvas(top, width=size[0], height=size[1], highlightthickness=0)
canvas.pack()
canvas.create_image(0, 0, image=photo, anchor="nw")
root.mainloop()
```
阅读全文