【问题标题】:different foreground colors for each line in wxPython wxTextCtrlwxPython wxTextCtrl中每一行的不同前景色
【发布时间】:2011-10-12 00:26:35
【问题描述】:

我有一个多行

wx.TextCtrl()

我设置的对象是用于编写字符串的前景和背景颜色。我需要用不同的颜色编写不同的行,

wx.TextCtrl.setForgroundcolor()

也改变了所有以前的线条颜色。有没有办法解决这个问题?

【问题讨论】:

    标签: python wxpython


    【解决方案1】:

    wx.Python 中有几种方法可以获取彩色文本。

    • wx.TextCtrlwx.TE_RICHwx.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 可能是一种非常简单的方法。

    【讨论】:

      【解决方案2】:

      如果您需要在插入之前为线条设置颜色,您可以更改基本属性:

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

      结果:

      【讨论】:

        【解决方案3】:

        wx.TextCtrl 的替代品是wx.ListCtrl,它具有每行接口。

        您可以设置wx.ListCtrl 的颜色 SetItemBackgroundColourSetItemTextColour

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-04-09
          • 1970-01-01
          • 2014-12-01
          • 1970-01-01
          • 2013-06-17
          • 2021-05-08
          • 2021-05-20
          相关资源
          最近更新 更多