Изменение цвета текста, автоматически вставляемого в виджет tkinter

У меня есть виджет текстового поля, в который вставлены три сообщения. Одно — это начальное сообщение, одно — конечное сообщение, и одно — сообщение для оповещения об уничтожении «юнитов». Я хочу, чтобы начальное и конечное сообщения были черными, а уничтоженные сообщения (см., где я прокомментировал код) были окрашены в красный цвет при вставке в виджет.

Я не совсем уверен, как это сделать. Я взглянул на Как изменить цвет определенных слов в текстовом виджете tkinter? и это будет работать, однако оно изменяет свойства текста только в том случае, если текст выбран с помощью мыши, тогда как я хочу, чтобы мой текст автоматически вставляться в этот цвет.

Любые предложения, чтобы указать мне в правильном направлении? Я относительно новичок в Tkinter. Я использую Python 3.6.

import tkinter as tk
import random

class SimulationWindow():

    def __init__(self, master):

        #Initialise Simulation Window
        self.master = master
        self.master.geometry('1024x768') #w,h

        #Initialise Mainframe
        self.mainframe()

    def mainframe(self):

        #Initialise Frame
        self.frame = tk.Frame(self.master)
        self.frame.grid_columnconfigure(0, minsize = 100)
        self.frame.grid(row = 1, sticky = 'w')

        self.txtb_output = tk.Text(self.frame)
        self.txtb_output.config(width = 115, height = 30, wrap = tk.WORD)
        self.txtb_output.grid(row = 1, column = 0, columnspan = 3, padx = 50)

        btn_start = tk.Button(self.frame)
        btn_start.config(text = 'Start', borderwidth = 2, padx = 2, height = 2, width = 20)
        btn_start.bind('<Button-1>', self.start)
        btn_start.grid(row = 2, column = 1, padx = (0,65), pady = 20)


    def battle(self):
        if len(self.units) == 0:
            self.txtb_output.insert(tk.END, 'The battle has ended.\n')
        else:
            try:
                destroyed = random.randint(0,4)
                #I want the text here to be red
                self.txtb_output.insert(tk.END, 'The unit ' + self.units[destroyed] + ' has been destroyed.\n')
                self.units.remove(self.units[destroyed])
                self.frame.after(5000, self.battle)
            except:
                self.battle()

    def start(self, event):
        self.units = ['battle droid', 'battle droid', 'droid tank', 'super battle droid', 'battle droid']
        self.txtb_output.insert(0.0, 'The battle has begun.\n')
        self.battle()

def main():
    root = tk.Tk()
    main_window = SimulationWindow(root)
    root.mainloop()

main()

person Dawn    schedule 01.12.2017    source источник
comment
insert() имеет параметр tags, поэтому вы можете назначать тег, когда вы вставляете новый текст. И вы должны назначить цвет этому тегу. Вы можете использовать один и тот же тег для всех предупреждений, и вам нужно будет назначить цвет только один раз.   -  person furas    schedule 01.12.2017
comment
Вы разместили слишком много нерелевантного кода. минимальный воспроизводимый пример, вероятно, должен занимать около дюжины строк для этого вопроса.   -  person Bryan Oakley    schedule 01.12.2017


Ответы (1)


insert() имеет опцию tags, поэтому вы можете назначать тег (или несколько тегов) при вставке текста.

И тогда вам нужно только присвоить цвет этому тегу.

import tkinter as tk

root = tk.Tk()

txt = tk.Text(root)
txt.pack()

txt.tag_config('warning', background="yellow", foreground="red")

txt.insert('end', "Hello\n")
txt.insert('end', "Alert #1\n", 'warning')
txt.insert('end', "World\n")
txt.insert('end', "Alert #2\n", 'warning')

root.mainloop()

введите здесь описание изображения

person furas    schedule 01.12.2017