在 wxWidget TextCtrl 或 WXStyledTextCtrl 中,如何将样式化线条的背景颜色扩展到整行?

How can I extend the background color of a styled line to the whole line in a wxWidget TextCtrl or StyledTextCtrl?

使用 TextCtrl(在 wxPython 中)我可以设置背景,但它不会延伸到整行(至少在 GTK 后端不会)。

我的代码或多或少是这样做的:

self.txt.SetBackgroundColor(wx.WHITE)

self.txt.SetDefaultStyle(wx.TextAttr(wx.BLACK, col_green))
self.txt.AppendText("text1\n")

self.txt.SetDefaultStyle(wx.TextAttr(wx.BLACK, col_red))
self.txt.AppendText("text2\n")

我得到的:

[styled text1][         ctrl bg ]
[another styled text2][ ctrl bg ]


我的期望:

[styled text1][         keep text1 bg ]
[another styled text2][ keep text2 bg ]

StyledTextCtrl 似乎有一个更高级的 API 可以在所有后端上执行此操作,但我不知道我将如何去做。

SetDefaultStyle() 某些平台可能不支持。

如果您不介意让整个控件具有相同的背景,则首选 SetBackgroundColor()

StyledTextCtrl 的工作方式与 TextCtrl 完全不同。

  • 缓冲区中的文本具有样式。
  • 样式是简单的预定义数字,范围为 0-31。 (您最多只能在一个小部件中同时拥有 32 个样式)
  • 添加的文本默认使用样式 0
  • 样式具有字体、background/fg、...以及 EOLFilled属性
  • 等属性
  • 这个属性控制样式是否应用于行的其余部分(我需要的)

所以基本上是初始代码

self.txt.SetBackgroundColor(wx.WHITE)

self.txt.SetDefaultStyle(wx.TextAttr(wx.BLACK, col_green))
self.txt.AppendText("text1\n")

self.txt.SetDefaultStyle(wx.TextAttr(wx.BLACK, col_red))
self.txt.AppendText("text2\n")

使用 StyledTextCtrl 变成:

#
# init the styles
#
style_text1 = 1
self.txt.StyleSetBackground(style_text1, col_red)
self.txt.StyleSetEOLFilled(style_text1, True)

style_text2 = 2
self.txt.StyleSetBackground(style_text2, col_green)
self.txt.StyleSetEOLFilled(style_text2, True)

#
# helper to append styled text
#
def append_text(self, text, style=None):
    start = self.txt.GetLength()
    self.txt.AppendText(text)
    nb = self.txt.GetLength() - start
    if style:
        self.txt.StartStyling(start, 31)
        self.txt.SetStyling(nb, style)

# since I use a readonly widget to only display data
# unlock the widget while we append
self.txt.SetReadOnly(False)
self.txt.SetEditable(True)

append_text("text1\n", style_text1)
append_text("text2\n", style_text2)

# lock again
self.txt.SetReadOnly(True)
self.txt.SetEditable(False)


恐怕 wxTextCtrl 只支持对其中的文本应用样式(包括背景),即它不会为空 space 设置样式。我看到的唯一可能的解决方案是用 spaces 填充每行直到最大线宽。当然,只有使用固定宽度的字体,这才有机会正常工作。