RichTextCtrl 根据光标位置改变样式
RichTextCtrl changing style based on cursor position
我在 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 和按钮的 window。单击该按钮将清除 richtextctrl 并添加几行具有各种样式选项的文本。单击红色文本行,然后单击更新按钮将把控件中不在 Begin/EndTextColour 之间的所有内容写为红色。与粗体文本行相同,选择它然后单击按钮将使所有文本变为粗体。
我不确定我是否没有以正确的方式使用 richtextctrl,或者我是否发现了错误。
我在 [=27= 上尝试使用 wxPython 4.0.4 + Python 3.7.5 和 wxPython 4.1.0 + Python 3.8.5 ] 10个64位。
您正在从您点击的位置继承 wx.TextAttr
。
除非更改,否则样式保持有效。
要解决您的问题,请在清除文本后重置样式,即
def buttonPressed(self, event):
self.richTextCtrl.Clear()
self.richTextCtrl.SetDefaultStyle(wx.TextAttr()) # add this line
我在 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 和按钮的 window。单击该按钮将清除 richtextctrl 并添加几行具有各种样式选项的文本。单击红色文本行,然后单击更新按钮将把控件中不在 Begin/EndTextColour 之间的所有内容写为红色。与粗体文本行相同,选择它然后单击按钮将使所有文本变为粗体。
我不确定我是否没有以正确的方式使用 richtextctrl,或者我是否发现了错误。
我在 [=27= 上尝试使用 wxPython 4.0.4 + Python 3.7.5 和 wxPython 4.1.0 + Python 3.8.5 ] 10个64位。
您正在从您点击的位置继承 wx.TextAttr
。
除非更改,否则样式保持有效。
要解决您的问题,请在清除文本后重置样式,即
def buttonPressed(self, event):
self.richTextCtrl.Clear()
self.richTextCtrl.SetDefaultStyle(wx.TextAttr()) # add this line