【问题标题】:How can I make part of the text in the Entry bold and change its background color?如何使条目中的部分文本变为粗体并更改其背景颜色?
【发布时间】:2020-05-29 14:39:09
【问题描述】:

我正在创建一个基于 Tkinter 的 GUI,它有一个 Entry 小部件。我想将其文本的一部分加粗并更改其背景颜色。但我不知道我该怎么做。如果我使用 Text 小部件,我可以只使用标签,但看起来它们不能与 Entry 小部件一起使用:

此代码正在使用 Text 小部件:

import tkinter as tk
from tkinter.font import Font


root = tk.Tk()
text = tk.Text(root, font=Font(size=12))
text.insert("1.0", "I want THIS PART to be bold and have red background")
text.tag_configure("bold-and-red", font=Font(size=12, weight="bold"), background="red")
text.tag_add("bold-and-red", "1.7", "1.16")
text.pack()
root.mainloop()

一切正常(文本小部件已显示,“本部分”为粗体且背景为红色)

这段代码使用了 Entry 小部件:

import tkinter as tk
from tkinter.font import Font


root = tk.Tk()
entry = tk.Entry(root, font=Font(size=12))
entry.insert(0, "I want THIS PART to be bold and have red background")
entry.tag_configure("bold-and-red", font=Font(size=12, weight="bold"), background="red")
entry.tag_add("bold-and-red", 7, 16)
entry.pack()
root.mainloop()

我只是得到错误:

AttributeError: 'Entry' 对象没有属性 'tag_configure'

有没有办法为 Entry 小部件做我想做的事情?

【问题讨论】:

    标签: python tkinter


    【解决方案1】:

    正如@BryanOakley 所说,更改某些字符外观的唯一方法是使用自定义Text 小部件。

    这是一个示例实现:

    import tkinter as tk
    from tkinter.font import Font
    
    
    class OneLineText(tk.Text):
        def __init__(self, master, *args, **kwargs):     
            super().__init__(master, *args, height=1, wrap="none", **kwargs)
    
            self.bind("<Return>", lambda event: "break")
            self.bind("<Key>", self.on_keypress)
            self.bind("<Control-a>", self.select_all)
            self.bind("<Control-A>", self.select_all)
            self.bind("<Control-v>", lambda event: self.see("end"))
            self.bind("<Control-V>", lambda event: self.see("end"))
    
        def on_keypress(self, event):
            self.see("end-1c")
    
        def select_all(self, event):
            self.tag_add("sel", "1.0", "end-1c")
            return "break"
    
        def insert(self, index, string):
            string = string.replace("\n", "")
            if isinstance(index, int):
                super().insert("1.{}".format(index), string)
                return
            if index == "end":
                super().insert("end-1c", string)
                return
            super().insert(index, string)
    
        def get(self):
            return super().get("1.0", "end-1c")
    
    root = tk.Tk()
    entry = OneLineText(root, font=Font(size=12))
    entry.insert(0, "I want THIS PART to be bold and have red background")
    entry.tag_configure("bold-and-red", font=Font(size=12, weight="bold"), background="red")
    entry.tag_add("bold-and-red", "1.7", "1.16")
    entry.pack()
    root.mainloop()
    

    Text 小部件的insertget 方法被修改为像在Entry 小部件中一样工作。

    【讨论】:

      【解决方案2】:

      如何使条目中的部分文本变为粗体并更改其背景颜色? ...如果我使用 Text 小部件,我可以只使用标签,但看起来它们不能与 Entry 小部件一起使用:

      您是对的:您不能只更改条目小部件中某些字符的外观,除非通过选择机制。

      如果您只想更改某些字符的外观,则需要改用单行 Text 小部件。

      【讨论】:

        猜你喜欢
        • 2013-04-10
        • 2018-07-12
        • 2023-02-23
        • 2023-01-30
        • 1970-01-01
        • 1970-01-01
        • 2011-11-29
        • 2012-04-16
        • 1970-01-01
        相关资源
        最近更新 更多