Как я могу изменить цвет определенных слов в wxPython TextCtrl?

Я создал графический интерфейс, который отображает только цитату. Как я могу изменить цвет всего слова «ты» в приведенной ниже цитате на синий? Я попробовал SetForegroundColour, но весь текст становится синим.

Вот код:

import wx

string='''"Have more than thou showest,

Speak less than thou knowest,

Lend less than thou owest,

Ride more than thou goest,

Learn more than thou trowest,

Set less than thou throwest."

—The Fool in King Lear'''

class Quote(wx.Frame):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        self.InitUI()

    def InitUI(self):
        panel=wx.Panel(self)

        self.text=wx.TextCtrl(panel, pos=(20,20), size=(250,220),
            style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.text.AppendText(string)
        self.text.SetForegroundColour("blue")

        self.SetSize(300,300)
        self.Centre()
        self.Show(True)

def main():
    app=wx.App()
    Quote(None)
    app.MainLoop()

if __name__ == '__main__':
    main()

Вот как это выглядит


person Nuh Yamin    schedule 20.09.2017    source источник


Ответы (1)


Возможно, вам нужно прочитать RichTextCtrl https://wxpython.org/Phoenix/docs/html/richtextctrl_overview.html

Просто используя TextCtrl, вы можете
1 установить атрибуты стиля постфактум (спасибо, Робин за ваш комментарий) или
2 применить атрибуты стиля к тексту по ходу дела. .

Установка атрибутов стиля постфактум с использованием re для предварительного поиска всех вхождений вашего слова:

import wx
import re

string='''"Have more than thou showest,

Speak less than thou knowest,

Lend less than thou owest,

Ride more than thou goest,

Learn more than thou trowest,

Set less than thou throwest."

-The Fool in King Lear'''

class Quote(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, None, -1)
        self.InitUI()

    def InitUI(self):
        panel=wx.Panel(self)
        word = 'thou'
        word_colour = wx.TextAttr(wx.BLUE)
        word_occurs = self.find_str(word,string)
        self.text=wx.TextCtrl(panel, pos=(20,20), size=(250,220),
            style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.text.AppendText(string)
        for i in word_occurs:
            #SetStyle(start pos, end pos, style)
            self.text.SetStyle(i,i+len(word),word_colour)
        self.SetSize((300,300))
        self.Centre()
        self.Show(True)

    def find_str(self,sub,sent): #return positions of the word
        return [x.start() for x in re.finditer(sub,sent)]

def main():
    app=wx.App()
    Quote()
    app.MainLoop()

if __name__ == '__main__':
    main()

Длинный способ сделать это, применяя атрибуты стиля по мере продвижения:

import wx

string1='''"Have more than'''
string2='''showest,

Speak less than'''
string3='''knowest,

Lend less than'''
string4='''owest,

Ride more than'''
string5='''goest,

Learn more than'''
string6='''trowest,

Set less than'''
string7='''throwest."

-The Fool in King Lear'''

class Quote(wx.Frame):
    def __init__(self, *args, **kwargs):
        wx.Frame.__init__(self, None, -1)
        self.InitUI()

    def InitUI(self):
        panel=wx.Panel(self)

        self.text=wx.TextCtrl(panel, pos=(20,20), size=(250,220),
            style=wx.TE_MULTILINE|wx.TE_READONLY)
        self.text.AppendText(string1)
        self.text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
        self.text.AppendText(" thou ")
        self.text.SetDefaultStyle(wx.TextAttr(wx.NullColour))
        self.text.AppendText(string2)
        self.text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
        self.text.AppendText(" thou ")
        self.text.SetDefaultStyle(wx.TextAttr(wx.NullColour))
        self.text.AppendText(string3)
        self.text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
        self.text.AppendText(" thou ")
        self.text.SetDefaultStyle(wx.TextAttr(wx.NullColour))
        self.text.AppendText(string4)
        self.text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
        self.text.AppendText(" thou ")
        self.text.SetDefaultStyle(wx.TextAttr(wx.NullColour))
        self.text.AppendText(string5)
        self.text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
        self.text.AppendText(" thou ")
        self.text.SetDefaultStyle(wx.TextAttr(wx.NullColour))
        self.text.AppendText(string6)
        self.text.SetDefaultStyle(wx.TextAttr(wx.BLUE))
        self.text.AppendText(" thou ")
        self.text.SetDefaultStyle(wx.TextAttr(wx.NullColour))
        self.text.AppendText(string7)

        self.SetSize((300,300))
        self.Centre()
        self.Show(True)

def main():
    app=wx.App()
    Quote()
    app.MainLoop()

if __name__ == '__main__':
    main()

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

person Rolf of Saxony    schedule 20.09.2017
comment
Вы также можете использовать SetStyle для изменения стиля существующего диапазона текста. Таким образом, вы можете поместить всю строку в элемент управления за один шаг, а затем установить стили в соответствующих начальных/конечных позициях. - person RobinDunn; 20.09.2017
comment
@RobinDunn Я узнаю больше, отвечая на вопросы, чем когда-либо, задавая их! :) - person Rolf of Saxony; 21.09.2017
comment
Спасибо, Рольф Саксонский. Ваш ответ очень полезен. - person Nuh Yamin; 22.09.2017