2011-10-12 31 views
6

Tôi có một multilinemàu foreground khác nhau cho mỗi dòng trong wxPython wxTextCtrl

wx.TextCtrl() 

đối tượng mà ta đã đặt nó forground và nền màu sắc cho văn bản strings.I cần phải viết dòng khác nhau với màu sắc khác nhau,

wx.TextCtrl.setForgroundcolor() 

cũng thay đổi tất cả các dòng màu trước đó. Có cách nào để khắc phục sự cố này không?

Trả lời

11

Có nhiều phương pháp trong wx.Python để có được văn bản màu.

  • wx.TextCtrl với wx.TE_RICH, wx.TE_RICH2 phong cách
  • wx.stc.StyledTextCtrl
  • wx.richtext.RichTextCtrl
  • wx.HtmlWindow (chèn thẻ màu sắc trong văn bản của bạn)
  • wx.ListCrtl

Bạn có thể lấy ví dụ về tất cả trong số họ trong th e wxPython bản demo

Ví dụ, bạn có thể thay đổi fore và màu nền trong bất kỳ phần nào của một 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 cũng rất dễ dàng để sử dụng để viết dòng với màu sắc khác nhau:

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

Như được chỉ ra trong câu trả lời khác việc sử dụng một wx.ListCrtl có thể là một phương pháp rất straighforward nếu bạn làm việc với dòng văn bản (thay vì văn bản nhiều dòng).

5

Nếu bạn cần màu sắc thiết lập cho dòng trước khi chèn bạn có thể thay đổi các thuộc tính cơ bản:

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

Dưới đây là ví dụ:

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

Kết quả:

enter image description here

Các vấn đề liên quan