【问题标题】:How to use tkinter tag_config? Python 3.7.3如何使用 tkinter tag_config? Python 3.7.3
【发布时间】:2019-05-02 16:38:39
【问题描述】:

所以我想做一个文本编辑器,但我一直卡在这部分,我想让它实时改变某个输入的单词的颜色,例如:假设我输入 print 我希望它自动将前景色从默认的黑色更改为蓝色。我真的不知道您是否必须使用 tag_configure 来执行此操作,但如果可以,请有人帮我解决,谢谢。

代码:

from tkinter import *

root = Tk()

text = Text(root)
text.grid(row=0)

def Event(event):
    text.tag_configure("print", foreground="blue")

#This is a KeyBind to trigger the Function: Event
root.bind("<Return>", Event)

root.mainloop()

【问题讨论】:

标签: python-3.x windows tkinter


【解决方案1】:

如果您想在输入时更改文本的颜色,您需要做一些事情:

  1. 定义具有所需颜色的标签。你已经得到了:

    text.tag_configure("print", foreground="blue")

有效。您可能希望能够触发其他更改颜色的事件以应用于新键入的文本,否则您的编辑器将非常无聊。您可以为每个按钮设置几个不同颜色的按钮,等等。您可能需要多个标签,因为如果您更改“打印”标签的配置,所有已用该标签名称标记的内容都会更改以匹配新配置。

  1. 那么您必须在输入文本时将标记应用于文本。可能有几种方法可以做到这一点,但您可以通过为"&lt;Key&gt;" 事件设置绑定来处理输入的每个字符.每次触发事件时,由于输入了新字符,请返回并将标签“打印”应用于该字符。

所以,大致如下:

root.bind("<Key>", on_key)

还有:

def on_key(event=None):
    text.tag_add("print", "INSERT - 1c", "INSERT")

这应该大致可以满足您的需求,但是随着它的设置,它仍然不会太有趣。您可以有多个标签,每个标签都配置为在视觉上不同(不同的前景色和背景色等),并根据您认为合适的方式将不同的标签应用于您正在输入的内容。

INSERT 是一个特殊的 Text 小部件标记,它表示插入点/光标在小部件中的位置。在您键入时,INSERT 会一直向右移动,总是在您键入的内容之后。因此,“INSERT - 1c”是之前的位置,指向刚刚输入的字符。

【讨论】:

    【解决方案2】:

    tag_configure 仅用于配置tag,但您必须将tag 分配给文本中的单词以更改其颜色。

    您可以使用text.tag_add(tag_name, text_start, text_end) 为选定的文本添加标签。

    问题可能是如何找到text_starttext_end的单词或行。

    Tkinter 具有特殊值,例如 endinsertwordstart 等。

    我用不同的标签来改变最后一行和最后一个单词的颜色。它显示了不同的情况。

    我使用-2c 跳过最后一个Return,但在其他系统中它可能只需要-1c。如果没有-2c,它将在您将新字符放入新行时使用颜色。

    如果你在最后一个单词后面加上空格,它不会找到最后一个单词。

    如果您更改tag_configure 的顺序,则可能无法正常工作。

    import tkinter as tk
    
    # --- functions ---
    
    def on_return(event):
        # -2c (-2chars) to skip `Return`
    
        # red color for last line
        text.tag_add('red_fg', 'end-2c linestart', 'end-2c')
    
        # blue color for last word
        text.tag_add('blue_fg', 'insert-2c wordstart', 'end-2c')
    
    
    # --- main ---
    
    root = tk.Tk()
    
    text = tk.Text(root)
    text.pack()
    
    # tag's order can be important
    text.tag_configure("red_fg", foreground="red")
    text.tag_configure("blue_fg", foreground="blue")
    
    root.bind("<Return>", on_return)
    
    root.mainloop()
    

    effbot.org:Text

    Tcl/Tk:Text indices

    TkDocs: Text -> 文本位置和索引

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-04-30
      • 2020-09-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-30
      • 2019-08-21
      相关资源
      最近更新 更多