RichTextCtrl изменение стиля в зависимости от положения курсора

У меня странное поведение с wx.richtext.RichTextCtrl. У меня есть панель, содержащая RichTextCtrl только для чтения, содержащая некоторую текстовую информацию об объекте, и кнопку, обновляющую содержимое при нажатии. В зависимости от того, где пользователь поместил курсор на RichTextCtrl, каждый бит текста, не отформатированный с помощью BeginTextColour/EndTextColour (или BeginBold/EndBold), изменит стиль и цвет шрифта.

Я сделал небольшой пример, демонстрирующий то же поведение:

import wx
import wx.richtext

class MyFrame(wx.Frame):    
    def __init__(self):
        super().__init__(parent=None, title='RichTextCtrl')
        panel = wx.Panel(self)

        self.richTextCtrl = wx.richtext.RichTextCtrl(panel, pos=(5, 5), size=wx.Size(150, 100))
        self.button = wx.Button(panel, label='Update', pos=(5, 110))
        self.button.Bind(wx.EVT_BUTTON, self.buttonPressed)

        self.Show()
        
    def buttonPressed(self, event):
        self.richTextCtrl.Clear()
        self.richTextCtrl.BeginBold()
        self.richTextCtrl.WriteText("abcd")
        self.richTextCtrl.EndBold()
        self.richTextCtrl.Newline()
        self.richTextCtrl.WriteText("abcd")
        self.richTextCtrl.Newline()
        self.richTextCtrl.BeginTextColour((255, 0, 0))
        self.richTextCtrl.WriteText("abcd")
        self.richTextCtrl.EndTextColour()
        self.richTextCtrl.Newline()
        self.richTextCtrl.BeginTextColour((0, 0, 0))
        self.richTextCtrl.WriteText("abcd")
        self.richTextCtrl.EndTextColour()

if __name__ == '__main__':
    app = wx.App()
    frame = MyFrame()
    app.MainLoop()

Откроется окно с richtextctrl и кнопкой. Щелчок по кнопке очистит richtextctrl и добавит несколько строк текста с различными параметрами стиля. Если щелкнуть красную строку текста, а затем нажать кнопку обновления, все элементы управления, а не между Begin/EndTextColour, будут выделены красным. То же самое и со строкой, выделенной жирным шрифтом, выделив ее и нажав кнопку, весь текст будет выделен жирным шрифтом.

Я не уверен, правильно ли я использую richtextctrl или обнаружил ошибку.

Я пробовал использовать wxPython 4.0.4 + Python 3.7.5 и wxPython 4.1.0 + Python 3.8.5 на 64-разрядной версии Windows 10.

1 ответ

Решение

Вы наследуете wx.TextAttrс позиции, на которую вы нажимаете.
Стиль остается в силе до тех пор, пока не будет изменен.
Чтобы устранить проблему, сбросьте стиль после очистки текста, т.е.

def buttonPressed(self, event):
    self.richTextCtrl.Clear()
    self.richTextCtrl.SetDefaultStyle(wx.TextAttr()) # add this line
Другие вопросы по тегам