различные цвета для каждой строки в wxPython, в wxTextCtrl

у меня есть многострочный

wx.TextCtrl()

объект, который я установил, это цвета forground и Background для написания строк.Мне нужно писать разные строки с разными цветами,

wx.TextCtrl.setForgroundcolor()

изменяет все предыдущие цвета линий.Есть ли способ обойти это?

3 ответов


в wx есть несколько методов.Python для получения цветного текста.

  • wx.TextCtrl С wx.TE_RICH, wx.TE_RICH2 стили
  • wx.stc.StyledTextCtrl
  • wx.richtext.RichTextCtrl
  • wx.HtmlWindow (вставка цветных тегов в текст)
  • wx.ListCrtl

вы можете получить примеры всех из них в демо-версии wxPython

например, вы можете изменить передние и фоновые цвета в любой части wx.TextCrtl:

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.ListCrtl может быть очень прямым методом, если вы работаете со строками текста (вместо многострочного текста).


Если вам нужно установить цвет для строки перед вставкой вы можете изменить основные свойства:

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()

результат:

enter image description here


альтернатива wx.TextCtrl is wx.ListCtrl, который имеет интерфейс на линию.

вы можете установить цвета wx.ListCtrl С SetItemBackgroundColour и SetItemTextColour