Как сделать часть текста в Entry жирным шрифтом и изменить цвет фона? - PullRequest
1 голос
/ 29 мая 2020

Я создаю GUI на основе Tkinter, и у него есть виджет 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()

Все работает хорошо (виджет Текст отображается, а «ЭТА ЧАСТЬ» выделена жирным шрифтом и имеет красный фон)

И этот код использует виджет входа:

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?

Ответы [ 2 ]

1 голос
/ 29 мая 2020

Как сказал @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._insert = lambda *args: tk.Text.insert(self, *args)
        self._get = lambda *args: tk.Text.get(self, *args)

        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):
            self._insert("1.{}".format(index), string)
            return
        if index == "end":
            self._insert("end-1c", string)
            return
        self._insert(index, string)

    def get(self):
        return self._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()

Методы insert и get изменены, чтобы выглядеть так, как они выглядят в виджете Entry.

1 голос
/ 29 мая 2020

Как сделать часть текста в Entry жирным шрифтом и изменить цвет фона? ... Если я использую виджет Text, я могу просто использовать теги, но похоже, что они не могут использоваться с виджетом Entry:

Вы правы: вы не можете изменить внешний вид только некоторые символы в виджете ввода, кроме механизма выбора.

Если вы хотите изменить внешний вид только определенных символов, вам нужно вместо этого использовать однострочный виджет Text.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...