【问题标题】:Changing the colour of text automatically inserted into tkinter widget更改自动插入 tkinter 小部件的文本颜色
【发布时间】:2018-05-15 11:24:00
【问题描述】:

我有一个文本框小部件,其中插入了三条消息。一个是开始消息,一个是结束消息,一个是在“单元”被破坏时发出警报的消息。我希望开始和结束消息为黑色,但销毁的消息(请参阅我在代码中注释的位置)在插入小部件时变为红色

我不太确定该怎么做。我看了一下How to change the color of certain words in the tkinter text widget?,这会起作用,但是如果使用鼠标选择文本,它只会更改文本属性,而我希望我的文本以该颜色插入自动

有什么建议可以为我指明正确的方向吗?我对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()

【问题讨论】:

  • insert() 具有选项tags,因此您可以在插入新文本时分配标签。你必须为这个标签分配颜色。您可以对所有警报使用相同的标签,并且您只需分配一次颜色。
  • 您发布了太多不相关的代码。对于这个问题,minimal reproducible example 可能只需要十几行左右。

标签: python python-3.x tkinter colors widget


【解决方案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()

【讨论】:

    猜你喜欢
    • 2013-04-20
    • 2021-07-07
    • 2012-11-15
    • 2021-05-15
    • 2011-10-21
    • 1970-01-01
    • 2016-08-08
    • 1970-01-01
    相关资源
    最近更新 更多