【问题标题】:tkinter tag_config does not worktkinter tag_config 不起作用
【发布时间】:2016-09-20 04:50:14
【问题描述】:

我正在 tkinter-python 中构建一个类似记事本的应用程序。有一个选项可以更改应用程序文本字段中写入的文本的字体。

我创建了一个字体选择器弹出屏幕,可在单击“字体”菜单时从主窗口调用,它基本上创建了一个 FontChooser 类对象并传递到主窗口,主窗口在主窗口中设置字体。

在主窗口中设置字体的代码示例是,

root = Tix.Tk(className="Notepad")
notepad = ScrolledText(root, width=100, height=100)

def open_font():
    font = MyFont.askChooseFont(root)
    notepad.tag_add("bt", "sel.first", "sel.last")
    notepad.tag_config("bt", font=font.getFontTuple())

现在,当我第一次运行应用程序并选择部分文本并更改字体时,它可以正常工作。但在那之后,无论我选择和更改字体的文本部分,它都会忽略选择并将字体应用于整个文本。谁能让我知道这里有什么问题?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    IDLE 使用 tag_config 对 Python 代码进行语法着色,并且在过去 15 年中它适用于所有 Python 版本和主要操作系统。

    要了解它为什么对您来说似乎失败了,您需要找到一个失败的MCVE。开始时不使用 tix 和滚动条。 (Tix 在 3.6 中已弃用,并且错误未得到修复。)另请注意,您的代码对每个选择使用相同的标记,因此当您更改配置时,它适用于所有以前的选择。

    这是按预期和预期工作的简化代码。

    import tkinter as tk
    import time
    root = tk.Tk()
    text = tk.Text(root)
    text.pack()
    text.insert('1.0', "line 1\nline 2\nline 3\n")
    text.tag_add('bg', '1.0', '1.4')
    text.tag_config('bg', background='red')
    root.update()
    time.sleep(1)
    text.tag_add('bg', '2.0', '2.4')
    text.tag_config('bg', background='blue')
    root.update()
    

    您可以尝试逐步修改它,直到它重现您的问题或执行您想要的操作。

    使用示例修改进行编辑:使用“sel.first”和“sel.last”而不是硬编码索引。

    import tkinter as tk
    import time
    root = tk.Tk()
    text = tk.Text(root)
    text.pack()
    text.insert('1.0', "line 1\nline 2\nline 3\n")
    root.update()  # make text visible for selection
    input('select some text')
    text.tag_add('bg', 'sel.first', 'sel.last')
    text.tag_config('bg', background='red')
    root.update()  # make change visible
    input('select some text')
    text.tag_add('bg', 'sel.first', 'sel.last')
    text.tag_config('bg', background='blue')
    root.update()  # make 2nd change visible
    input('look at result')
    

    在控制台中运行。移动 tk 窗口,使控制台和 GUI 都可见。根据提示进行选择。单击控制台* 并按回车键以允许输入语句返回。重复。对我来说,结果是两个选项(但不是所有选项)都变成蓝色。我建议在下一个实验中更改字体而不是 bg 颜色。

    • 在 Windows 上,在 tk 窗口中突出显示的选择会在单击控制台时消失,因为 Windows 一次只允许在一个窗口中进行可见选择。但是,选择标记仍然存在于文本小部件中,因此 tag_add 仍然有效。

    【讨论】:

    • 在这里您将标签范围硬编码为 1.0 到 1.4。问题似乎与定义为“sel.first”和“sel.last”的范围有关。不知何故,在第一遍之后,从第二遍开始,这个选择不是我实际选择的文本。它正在考虑 TextArea 上的整个文本。
    • “看似”的问题往往不是问题所在。这就是为什么我建议你做最小的改变实验——找出问题所在。请重新阅读我的建议。我做了将硬编码索引更改为选定索引的实验,后者本身不是问题。你应该继续下一个实验——改变字体而不是颜色。
    猜你喜欢
    • 1970-01-01
    • 2018-10-20
    • 2016-06-06
    • 1970-01-01
    • 2021-05-25
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 2018-03-05
    相关资源
    最近更新 更多