tkdev4
是tkinter
的高级扩展库,大多使用win32
进行开发,所以对Windows
的支持很好。原本叫做tkinterDev
的,
然后就为了大版本更新,改了很多东西,放弃了那个旧版本,改为了船新的4.0版本。文档现在我都有点懒得写了,特别多的方法,一时半会弄不完,就现在CSDN里写文档了。
安装
这里的话,还是推荐使用4.2.3
也就是现在我开发这个时间的版本,暂时还没有BUG
。
而如果我以后更新,指不定出现一些BUG
(这样的事已经出现了很多了)。
pip install tkdev4
接下来,要安装依赖库,我做了一个快速安装的方法,可以一下安装所有的扩展库
from tkdev4 import Install_ALL
Install_ALL()
初始化(可选)
这个主要为了后面安装Winico扩展而准备的。如果不想使用托盘图标,就可以不看这个。
python -m tkdev4
实现浅色和深色的主题切换
注意,这个方法只有Windows11 21H2版本才可以使用,其他系统,或其他版本的均不可使用。
我开发了一个组件DevManage
,用于管理组件的,专门使用Win32
开发的,所以有许多的功能。
其中使用dwmapi
做了一个快速切换主题的功能(原来的需要研究很久才能做好)。
DevManage(master: tk.Tk)
- master是被管理的组件
dwm_set_window_attribute_use_dark_mode()
- 切换成暗黑模式
dwm_set_window_attribute_use_light_mode()
- 切换成明亮模式
经检验测试发现,想要切换,必须要设置好图标(我也不知道为什么),这里就使用我这个库里面的图标,快速开始。
这里为了更加符合黑暗模式,就将窗口改为了黑色。
from tkdev4 import DevManage, Icon_Empty
from tkinter import Tk
root = Tk()
root.iconbitmap(Icon_Empty)
root.configure(background="#000000")
manage = DevManage(root)
manage.dwm_set_window_attribute_use_light_mode() # 切换为明亮模式(默认)
manage.dwm_set_window_attribute_use_dark_mode() # 切换为暗黑模式
root.mainloop()
这里因为我的系统是Windows11 22H2,标题栏被改成了云母特效,比22H2低的版本不会有。
但是并不影响正常使用。
这里明亮模式我就不演示,毕竟明亮模式也就是什么也没加,也就是取消了黑暗模式而已。
修改圆角样式
注意,这个方法只有Windows11 21H2版本才可以使用,其他系统,或其他版本的均不可使用。
圆角样式在Windows11很常见,也没必要修改,但是我也不知道为什么我自己要加入这个功能。
dwm_set_window_round_round()
- 设置为正常圆角
dwm_set_window_round_round_small
- 设置为小圆角
dwm_set_window_round_donot_round()
- 设置为没有圆角
这个我也不知道为啥,似乎只要设置了图标才能使用
无圆角
from tkdev4 import DevManage, Icon_Empty
from tkinter import Tk
root = Tk()
root.iconbitmap(Icon_Empty)
manage = DevManage(root)
manage.dwm_set_window_round_donot_round()
root.mainloop()
小圆角
from tkdev4 import DevManage, Icon_Empty
from tkinter import Tk
root = Tk()
root.iconbitmap(Icon_Empty)
manage = DevManage(root)
manage.dwm_set_window_round_round_small()
root.mainloop()
虽然这个样式确实是改了,但是区别不算太大。我感觉像Basic的圆角大小。
之后,圆角我就不展示了,没什么好看的,是默认的样子。
修改窗口渲染
注意,这个方法只有Windows Vista版本及以上版本才可以使用,其他系统,或更低版本的均不可使用。
我不知道这个有没有必要,我设置的一些数值,会变成Basic界面。
dwm_set_ncrendering_policy(value=2)
- value 为渲染政策
DWMNCRP_USEWINDOWSTYLE
value 0
非客户端渲染区域根据窗口样式进行渲染。DWMNCRP_DISABLED
value 1
非工作区呈现被禁用;窗口样式将被忽略。DWMNCRP_ENABLED
value 2
启用非工作区渲染;窗口样式将被忽略。DWMNCRP_LAST
value 3
最大已识别 DWMNCRENDERING 策略值,用于验证目的。
经测试,value 0
和value 2
都会说原来的样子,value 1
会变成Basic
界面,value 3
将会在失去焦点后变成Basic
界面。
from tkdev4 import DevManage, Icon_Empty
from tkinter import Tk
root = Tk()
root.iconbitmap(Icon_Empty)
manage = DevManage(root)
manage.dwm_set_ncrendering_policy(1)
root.mainloop()
托盘图标
托盘图标也就是右下角的那一些图标,点击后一般会打开窗口,右键一般会打开配置。
而这篇文章需要使用初始化
,也就是上面讲的那些如何初始化的地方。不过,他会自动运行初始化的,安装的。我使用了tcl/tk
的扩展库Winico
来运行,它可以让我更加方便进行开发托盘图标。
对了,我们还需要安装Winico
但这些不要管,你只要使用了这个组件,他会自动安装的,没必要管。
我将它做成了DevTray组件,通过调用tcl/tk
来使用Winico
。
from tkdev4 import DevTray
from tkinter import Tk
root = Tk()
tray = DevTray(root)
tray.show()
root.mainloop()
我事先为这个库定义了默认事件函数,所以可以快速使用。接下来你就会看到右下角多了一个图标,这个图标是从Winico
扩展库中找到的,准确位置在Python/tcl/pkg/tkchat.ico
。
参数
text
托盘上的提示文本
icon
托盘图标
icon
托盘图标模式
none
为从自己设置图标 可以使用createfrom
或者load
设置,这两个都会返回图标ID。icon
为从本地加载图标load
为从系统默认图标中加载图标
menu_func
为事件处理,会返回一些数据
- event
为发生的事件
- icon_id
图标ID
- icon
返回自己
- x
发生事件的X坐标
- y
发生事件的Y坐标
删除图标
如果不想要这个图标,可以使用delete
设置,需要设置图标ID,图标ID可以通过icon
获得。
from tkdev4 import DevTray
from tkinter import Tk
root = Tk()
tray = DevTray(root)
tray.delete(tray.icon)
root.mainloop()
这样就成功删除了一个图标。