Wxpython RichTextCtrl根据光标位置更改样式

Wxpython RichTextCtrl根据光标位置更改样式,wxpython,richtextctrl,Wxpython,Richtextctrl,我对wx.richtext.RichTextCtrl有一种奇怪的行为。我有一个面板,其中包含一个只读RichTextCtrl,其中包含一些关于对象的文本信息,还有一个按钮,在单击时更新内容。根据用户将光标放在RichTextCtrl上的位置,未使用BeginTextColor/EndTextColor(或BeginBold/EndBold)格式化的每一位文本都将更改字体样式和颜色 我举了一个小例子,展示了同样的行为: import wx import wx.richtext class MyF

我对wx.richtext.RichTextCtrl有一种奇怪的行为。我有一个面板,其中包含一个只读RichTextCtrl,其中包含一些关于对象的文本信息,还有一个按钮,在单击时更新内容。根据用户将光标放在RichTextCtrl上的位置,未使用BeginTextColor/EndTextColor(或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并添加几行具有各种样式选项的文本。单击一条红线文本,然后单击更新按钮将把控件中的所有内容写入红色,而不是开始/结束文本颜色。和粗体文本行相同,选择该行,然后单击按钮将以粗体显示所有文本

我不确定是否使用richtextctrl的方式不正确,或者是否发现了bug


我尝试在Windows 10 64位上使用wxPython 4.0.4+Python 3.7.5和wxPython 4.1.0+Python 3.8.5。

您正在从单击的位置继承
wx.TextAttr

除非更改,否则样式将保持有效。
要解决问题,请在清除文本后重置样式,即

def buttonPressed(self, event):
    self.richTextCtrl.Clear()
    self.richTextCtrl.SetDefaultStyle(wx.TextAttr()) # add this line

您正在从单击的位置继承
wx.TextAttr

除非更改,否则样式将保持有效。
要解决问题,请在清除文本后重置样式,即

def buttonPressed(self, event):
    self.richTextCtrl.Clear()
    self.richTextCtrl.SetDefaultStyle(wx.TextAttr()) # add this line