在 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 填充每行直到最大线宽。当然,只有使用固定宽度的字体,这才有机会正常工作。
使用 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 填充每行直到最大线宽。当然,只有使用固定宽度的字体,这才有机会正常工作。