различные цвета для каждой строки в wxPython, в wxTextCtrl
у меня есть многострочный
wx.TextCtrl()
объект, который я установил, это цвета forground и Background для написания строк.Мне нужно писать разные строки с разными цветами,
wx.TextCtrl.setForgroundcolor()
изменяет все предыдущие цвета линий.Есть ли способ обойти это?
3 ответов
в wx есть несколько методов.Python для получения цветного текста.
-
wx.TextCtrlСwx.TE_RICH,wx.TE_RICH2стили wx.stc.StyledTextCtrlwx.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()
результат:
альтернатива wx.TextCtrl is wx.ListCtrl, который имеет интерфейс на линию.
вы можете установить цвета wx.ListCtrl С
SetItemBackgroundColour
и
SetItemTextColour
