2011-10-12 10 views
6

मैं एक बहुwxPython wxTextCtrl में प्रत्येक पंक्ति के लिए अलग अग्रभूमि रंग

wx.TextCtrl() 

वस्तु जो मैं सेट यह forground है और strings.I लिखने के लिए पृष्ठभूमि रंग अलग अलग रंग के साथ अलग-अलग लाइनों लिखने की ज़रूरत है,

wx.TextCtrl.setForgroundcolor() 

सभी पिछली लाइनों के रंगों को भी बदलता है। क्या इसके आसपास कोई रास्ता है?

उत्तर

11

वहाँ wx.Python में कई तरीकों रंगीन लेख प्राप्त करने के लिए कर रहे हैं के साथ wx.ListCtrl के रंग सेट कर सकते हैं।

  • wx.TE_RICH साथ wx.TextCtrl, wx.TE_RICH2 शैलियों
  • wx.stc.StyledTextCtrl
  • wx.richtext.RichTextCtrl
  • wx.HtmlWindow
  • wx.ListCrtl

आप उन सभी का उदाहरण प्राप्त कर सकते हैं (अपने पाठ में रंग टैग्स डालने) वें में ई wxPython डेमो

उदाहरण के लिए, यदि आप एक wx.TextCrtl के किसी भी हिस्से में सामने और पृष्ठभूमि रंग बदल सकते हैं:

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

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 अलग अलग रंग के साथ लाइनों लिखने के लिए उपयोग करने के लिए भी आसान है

जैसा कि अन्य उत्तर में इंगित किया गया है wx.ListCrtl का उपयोग एक बहुत ही कठोर विधि हो सकता है यदि आप पाठ की पंक्तियों (मल्टीलाइन टेक्स्ट के बजाय) के साथ काम करते हैं।

0

wx.TextCtrl का विकल्प wx.ListCtrl है जिसमें प्रति-लाइन इंटरफ़ेस है।

आप SetItemBackgroundColour और SetItemTextColour

+1

वास्तव में आप कर सकते हैं

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

यहाँ उदाहरण है । आपके उत्तर @Joaquin के लिए – joaquin

+0

+1; मुझे नहीं पता था ... – Remi

5

आप डालने से पहले लाइन के लिए सेट रंग की जरूरत है आप बुनियादी गुण बदल सकते हैं:

#!/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