wxPython wxTextCtrl中每行不同的前景色

7 投票
3 回答
6603 浏览
提问于 2025-04-17 04:08

我有一个多行的

wx.TextCtrl()

对象,我为它设置了前景色和背景色来写字符串。我想用不同的颜色写不同的行,

wx.TextCtrl.setForgroundcolor()

但是这样会把之前所有行的颜色都改掉。有没有什么办法解决这个问题呢?

3 个回答

0

一个可以替代 wx.TextCtrl 的选择是 wx.ListCtrl,它提供了逐行的界面。

你可以通过 SetItemBackgroundColourSetItemTextColour 来设置 wx.ListCtrl 中每一行的颜色。

6

如果你想在插入之前设置线条的颜色,可以先改变一些基本属性:

ctrlText.SetDefaultStyle(wx.TextAttr(wx.GREEN,wx.BLACK))
#where wx.GREEN - foreground, wx.BLACK - background for text
ctrlText.SetBackgroundColour(wx.BLACK)

这里有个例子:

#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx

class ColorTextForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Colored text")

        panel = wx.Panel(self, wx.ID_ANY)
        self.log = wx.TextCtrl(panel, wx.ID_ANY, size=(100,100),
                          style = wx.TE_MULTILINE|wx.TE_READONLY|wx.HSCROLL|wx.TE_RICH)

        self.log.SetDefaultStyle(wx.TextAttr(wx.GREEN, wx.BLACK))
        #self.log.SetBackgroundColour(wx.BLACK)
        self.bgColor = wx.WHITE
        self.log.SetBackgroundColour(self.bgColor)

        btnRed = wx.Button(panel, wx.ID_ANY, 'Red')
        btnGreen = wx.Button(panel, wx.ID_ANY, 'Green')
        self.cbBG  = wx.CheckBox(panel, label='White')
        self.Bind(wx.EVT_BUTTON, self.onButtonRed, btnRed)
        self.Bind(wx.EVT_BUTTON, self.onButtonGreen, btnGreen)
        self.Bind(wx.EVT_CHECKBOX, self.onCheckChangeBG, self.cbBG)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.log, 1, wx.ALL|wx.EXPAND, 5)
        sizer.Add(btnRed, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(btnGreen, 0, wx.ALL|wx.CENTER, 5)
        sizer.Add(self.cbBG, 0, wx.ALL|wx.CENTER, 5)
        panel.SetSizer(sizer)

    def onButtonGreen(self, event):
        self.log.SetDefaultStyle(wx.TextAttr(wx.GREEN,  self.bgColor))
        self.log.AppendText("Geen\n")

    def onButtonRed(self, event):
        self.log.SetDefaultStyle(wx.TextAttr(wx.RED,self.bgColor))
        self.log.AppendText("Red\n")

    def onCheckChangeBG(self, e):
        sender = e.GetEventObject()
        isChecked = sender.GetValue()
        if isChecked:
            self.bgColor = wx.BLACK
            self.cbBG.SetLabel('Black')
        else:
            self.bgColor = wx.WHITE
            self.cbBG.SetLabel('White')

if __name__ == "__main__":
    app = wx.PySimpleApp()
    frame = ColorTextForm().Show()
    app.MainLoop()

结果:

在这里输入图片描述

13

在wx.Python中,有几种方法可以获取带颜色的文本。

  • wx.TextCtrl,使用 wx.TE_RICHwx.TE_RICH2 样式
  • wx.stc.StyledTextCtrl
  • wx.richtext.RichTextCtrl
  • wx.HtmlWindow(在文本中插入颜色标签)
  • wx.ListCtrl

你可以在wxPython的演示中找到所有这些的示例。

例如,你可以在任何部分的 wx.TextCtrl 中改变前景色和背景色:

rt = wx.TextCtrl(self, -1,"My Text....",size=(200, 100),style=wx.TE_MULTILINE|wx.TE_RICH2)
rt.SetInsertionPoint(0)
rt.SetStyle(2, 5, wx.TextAttr("red", "blue"))

wx.richtext 也很容易使用,可以写出不同颜色的文本行:

rtc = wx.richtext.RichTextCtrl(self, style=wx.VSCROLL|wx.HSCROLL|wx.NO_BORDER)
rtc.BeginTextColour((255, 0, 0))
rtc.WriteText("this color is red")
rtc.EndTextColour()
rtc.Newline()

正如其他回答所提到的,使用 wx.ListCtrl 是处理文本行(而不是多行文本)时非常简单的方法。

撰写回答