我开始使用Tkinter制作GUI,我也添加了模块tkMessageBox.但最近我发现导入模块ttk会提供更多“最新”结果:按钮和文本框会显示当前操作系统的实际样式.这是:Windows 10按钮是纯蓝色和蓝色,而不是以前版本的阴影灰色块状按钮.
但不幸的是,我找不到在常用的Dialog Boxes(我从tkMessageBox导入的那些)上使用这个ttk主题小部件的方法.因此,确定/取消对话框(例如)仍然显示不属于Windows 10的主题.
我检查的所有文档都将我带到了Tkinter.
解决方法:
Windows上的Tk消息框是系统提供的消息框. Tk不使用Tk按钮和框架创建消息框,但显示Windows API提供的库存对话框.
为了检查你的报告,我运行了Tcl / Tk 8.6,Python 3.4和Powershell,并让每个人都显示了一个消息框.正如你所看到的那样,Tcl / Tk看起来正如我们所期望的那样,但Python和Powershell都默认为旧式的非主题外观和感觉.
这样做的原因很可能与启动它的可执行文件中的嵌入式清单有关. Tcl / Tk wish可执行文件包含一个清单资源,表明应用程序支持主题公共控件库. python.exe和pythonw.exe文件没有这样的资源.必要的清单嵌入在tkinter使用的Tk86.dll文件中,但我认为这需要与可执行文件相关联.我通过使用Visual Studio打开pythonw.exe文件并将现有的RT_MANIFEST资源替换为从Tk86.dll中提取的资源来测试此假设.使用合适的清单,Python tkinter消息框正确地为主题:
据推测,这个清单可以作为XML文件提供在与可执行文件相同的文件夹中,但在测试时似乎不起作用.我必须将清单实际嵌入可执行资源中.
有关清单资源的更多信息,请参见“Enabling Visual Styles”.