Tkinter Checkbutton 小部件上的单击事件不会在 GUI 上直观地更新小部件,但会在代码中更新

问题描述

Tl;dr:我们如何(我们可以从哪里获得信息)在此系统表示层对 Tkinter 进行故障排除? Tkinter 的维护者肯定会在某处记录一份指南。有什么想法可能导致这种“wtf?”体验?

注意!为了支持未来的故障排除事件,目标是了解根本原因,以便它可以在其他地方复制,然后应用修复

问题:
在此特定的 Kubuntu KDE plasma 5.18 机器配置上单击复选框时,Checkbutton 小部件不会更新。

Tkinter_Checkbox_VisualIssue

调查:
在以下环境中未出现此问题:

  1. Windows 8.1,
  2. 带有 LiveCD Kubuntu 20.04 (plasma 5.18) 的 VirtualBox
  3. 带有 LiveCD Kubuntu 20.10 (plasma 5.19) 的 VirtualBox
  4. Kubuntu 20.04(原始机器上的 XFCE)。

使用其他 GUI 框架进行测试可以正常工作。

  1. 基维
  2. GTK 版本 3
  3. wxPython

下一步:

  1. 搜索结果并未真正提供与此特定相关的指南或问题。
  2. 还请咨询有关 python org discuss platform 的建议。
  3. 尝试创建 TCL 测试版本。

测试源代码

from tkinter import *
class MyGUI:
    def __init__(self,window):
        self.var = Intvar()
        self.c = Checkbutton(window,text="Enable Tab",variable=self.var,command=self.cb)
        self.c.pack()

    def cb(self):
        print("self.var is",self.var.get())

if __name__ == "__main__":
    root = Tk()
    gui = MyGUI(root)
    root.mainloop()

输出

>self.var is 1  
>self.var is 0  
>self.var is 1

系统规格:
操作系统:Kubuntu 20.04
KDE 等离子版本:5.18.5
KDE 框架版本:5.68.0
Qt 版本:5.12.8
内核版本:5.4.0-58-generic
操作系统类型:64 位
处理器:英特尔 i3 4 核 M350 2.27GHz
内存:7,6 GiB 内存
Python 3.8.5
Tcl/Tk 8.6 版

解决方法

答案、解决方案和结论

根本原因是与“Breeze Dark”相关结果的“KDE Plasma Color Schemes”的“Window Text”颜色由于文本颜色与复选框背景非常相似,因此 Tkinter Checkbutton 不是 100% 可见。

Tkinter_KDEPlasma_BreezeDark_wtxt_Issue

解决方案/变通办法
建议在构建应用程序 GUI 时考虑样式(主题),通过使他们能够在某种程度上更改 GUI 来改善用户体验。在这种情况下,Tkinter 似乎正在使用用于其他目的的系统设置值。

最快的解决方法是至少导入 tkinter.ttk (Python3)。

    from tkinter import *
    from tkinter.ttk import *

Tkinter_KDEPlasma_BreezeDark_wtxt_Issue_solution

结论
我猜这会随着更多信息的可用而更新。 对于上述问题,幸运的是问题相对简单,应该是错误确认清单的一部分。然而,调试要复杂得多、模糊得多,或者是一门黑暗的艺术。以下是支持故障排除和调查 Tkinter 相关问题的一些说明。

  1. 由于 Tkinter 是 Tcl/tk 解释器的包装器,所以事情变得棘手。 Tkinter 源可以位于 GitHub
  2. 似乎起点是完成 Tcl Developer Xchange。来自相当活跃的社区的良好参考资料和资源。