различные цвета для каждой строки в 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()
результат:
альтернатива wx.TextCtrl
is wx.ListCtrl
, который имеет интерфейс на линию.
вы можете установить цвета wx.ListCtrl
С
SetItemBackgroundColour
и
SetItemTextColour