tkinter叠加窗口实现部分透明

tkiner叠加窗口实现部分透明

  • 引言
  • 提前申明
  • 构思
  • 效果
  • 延伸

引言

在通过tkinter制作屏幕弹幕这篇文章中讲到,当想让tkinter窗口底部变成透明时,可以修改tkinter窗口的“-transparentcolor”属性来规定某一种颜色成为透明色。

当然,这种设置是全窗口的。如果只是想让窗口某一部分的某一种颜色透明,得使用窗口叠加的办法来实现。

提前申明

该文章仅仅提供窗口局部透明的初步思路,目前不支持窗口拖动,仅在无标题栏、不可拖动的窗口下实现。功能待往后完善。

构思

首先,建立一个顶层窗口,作为tkinter窗口不透明部分的主体。在需要放置有透明效果组件的地方使用画布或组件本身的颜色作为透明色。参考代码如下:

from tkinter import *
from tkinter.ttk import *

chet=Tk()
chet.geometry('600x770+800+10')
chet.overrideredirect(True)#删除标题栏
chet.attributes('-transparentcolor','white')#使白色为透明色
Text(chet,bg='white').place(x=0,y=30,width=600,height=770)
#上面建议使用place布局,因为在叠加窗口中方便确定底层透明窗口的位置
#这里的Text只作为透明底色,不是实际有用控件
#chet.mainloop()

一般不建议直接从tkinter和ttk中导入全部组件。

然后再建立一个带透明度的窗口。这个窗口实际上被整一个控件覆盖,作为需要有透明度的控件。
在参考代码中,我们需要建立一个带透明度的文本编辑框,因此该窗口需要在这个文本框的位置被创建。

chet=Tk()
#...

chet_m=Tk()#85%透明的窗口叠加,视觉感受好
chet_m.attributes('-alpha',0.85)
chet_m.geometry('600x770+800+40')#位置要对其顶层窗口的缺口位置
chet_m.overrideredirect(True)
chrText=scrolledtext.ScrolledText(chet_m,fg='black',bg='white',wrap='word',relief='groove',borderwidth=4,font=('宋体',13),undo=True)#该文本框实际控件
chrText.pack(fill='both',expand=True)

chet.mainloop()

效果

tkinter叠加窗口实现部分透明_第1张图片
Tin知识库

需要注意的,这里的退出按钮是如下设计的,需要关闭所有使用到的窗口。

def destroys(win):
    for i in win:
        i.destroy()#销毁用到的窗口

Button(chet,text='退出',width=4,command=lambda : destroys([chet,chet_m])).place(x=450,y=0)

这个界面中,界面主体被设置为透明,下方被另一个带有85%透明设置的窗口补齐,从而达到窗口一部分透明,一部分不透明的效果。如果不嫌复杂,还可以在窗口的若干部分区域都实现半透明效果。

延伸

因为避免复杂,窗口叠加选择用固定的、不可移动的窗口,往后可以通过拖动事件绑定来实现有标题栏窗口的叠加。
另外,可以改进实现动态的透明组件。tkinter在完成这一类任务方面,还是有很强拓展性的

☀tkinter创新☀

你可能感兴趣的:(tkinter实验,tkinter,python)