【问题标题】:Click event on Tkinter Checkbutton widget does not update the widget visually on the GUI, but it does in codeTkinter Checkbutton 小部件上的单击事件不会在 GUI 上直观地更新小部件,但它会在代码中更新
【发布时间】:2021-03-30 11:45:18
【问题描述】:

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

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

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

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

  1. Windows 8.1,
  2. 带有 LiveCD Kubuntu 20.04 (Plasma 5.18) 的 VirtualBox,
  3. VirtualBox 与 LiveCD Kubuntu 20.10 (Plasma 5.19),
  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 Plasma 版本: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 RAM
Python 3.8.5
Tcl/Tk 版本 8.6

【问题讨论】:

  • 从github中的动画来看,checkbutton更新了,但是tick的颜色几乎是白色的。所以很难看到。
  • @acw1668 :我会快速检查 Plasma 主题并提供反馈。不会是第一次主题让我陷入困境。
  • @acw1668 :感谢您注意到 GIF 中的行为。不得不调整我的显示器对比度来获得它。现在确定了根本原因。当我在代码中更改 Tkinter 样式(alt、classic、clam、default)时,Checkbutton 的功能在视觉上是正确的。因此,结论是调查 KDE Plasma 样式和主题以确定系统主题为何会产生影响。我将用最终答案更新问题。也许也可以从 KDE Plasma 维护者那里获得一些反馈。

标签: python tkinter kde-plasma


【解决方案1】:

答案、解决方案和结论

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

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

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

    from tkinter import *
    from tkinter.ttk import *

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 2020-02-22
    • 2020-08-08
    • 2017-07-19
    • 2021-07-28
    相关资源
    最近更新 更多