【问题标题】:Strange background appearance in tkk.Frametkk.Frame 中出现奇怪的背景
【发布时间】:2018-02-28 01:19:54
【问题描述】:

我在 tkinter 中发现了一个异常。我在下面附上了我的脚本以显示异常情况。

运行这个脚本,我在我的系统(Ubuntu 16.04.03)上发现ttk.Frame 的背景看起来很奇怪。如果我将鼠标指针移入和移出ttk.Frame,则背景外观可能会发生变化并出现乱码(例如,可能会出现来自其他背景窗口的背景,可能会出现奇怪的颜色图案......)。

经过一些调查,我发现通过将background='light purple' 替换为background='white',异常消失并且ttk.Frame 外观的行为符合定义。也就是说,错误是由使用 tkinter 无法识别的背景/颜色名称引起的。

问题:

  1. 此异常是否发生在 Mac、Windows 或其他 Linux 系统中?

  2. tkinter 接受的有效背景名称是什么?我不是 能够在 tkinter 的 __init__.pyttk.py 中找到它。哪里可以 我找到他们了吗?

  3. 我认为 tkinter 需要更强大的背景名称检查例程 以减轻这种异常。我应该向谁注意?

测试脚本:

#!/usr/bin/python3
# -*- coding: utf-8 -*-

import tkinter as tk
import tkinter.ttk as ttk


class App(ttk.Frame):

    def __init__(self, parent=None, *args, **kwargs):

        style=ttk.Style()
        style.configure('App.TFrame', background='light purple')

        ttk.Frame.__init__(self, parent, style='App.TFrame', borderwidth=10,
                           relief='raised', width=200, height=200)
        self.parent = parent
        self.parent.geometry('300x300')


if __name__ == '__main__':
    root = tk.Tk()
    app = App(root)
    app.grid(row=0, column=0, sticky='nsew')
    app.grid_propagate(0)

    root.mainloop()

【问题讨论】:

  • 我在 OSX 上看不到这个。事实上,我从未在任何平台上看到过这种情况。
  • @BryanOakley。谢谢。注意到该代码适用于 OSX。我已经在 2 个物理上不同的 Ubuntu 16.04.3 系统上进行了尝试,并且异常是可重复的。 tkinter 如何知道哪个背景名称有效?这是在 tkinter 还是 tcl 完成的?
  • @BryanOakley 我添加了另一个在物理上不同的 Ubuntu 16.04.3 系统上看到的异常图像。在这里,ttk.Frame 变成透明的,露出 tkinter 窗口后面的桌面壁纸。

标签: python tkinter


【解决方案1】:

在 Win 10 3.7.0b1 上,没有给定背景会导致白色,可识别的背景就是它,未知背景(“浅紫色”或“xyz”)是黑色。至于公认的颜色名称:

NMT 8.5 参考说“'白色'、'黑色'、'红色'、'绿色'、'蓝色'、'青色'、'黄色'和'洋红色'将始终可用。其他名称也可以使用,具体取决于您的本地安装。”。

tcl/tk 8.6 文档列出了数百种颜色名称(但不是“浅紫色”!)以及一些特定于 MacOS 和 Windows 的颜色名称。

【讨论】:

  • 当声明一个无效的颜色名称时,人们会认为 tcl 会抛出一个错误消息。我想知道他们为什么不这样做?
  • @SunBear 我怀疑是因为颜色名称的有效性取决于正在使用的操作系统版本以及“本地安装”的其他功能,因为某些 tk 程序旨在跨平台工作.任何这样的决定都需要权衡。
  • 我恰好回答了@Idlehands 提出的一个相关问题。见here。根据我在那里学到的知识,我得出结论,Frame 小部件应该针对无法识别的颜色名称引发异常。目前,Frame 小部件背景正在生成Tk 窗口窗口及其内容的多个快照,有时以级联和随机顺序排列。我认为不应允许这种情况发生,即需要修复错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多