2017-10-21 101 views
0

我正在使用rtf控件來顯示文本。我無法理解rtf控制對象結構。你如何讓文本進入rtf緩衝區?使用wxPython富文本控件

我已經訪問了緩衝區並添加了一個xml處理程序。我從哪裏去?

import wx 
import wx.richtext as rt 


class MainFrame(wx.Frame): 
    """Create MainFrame class.""" 
    def __init__(self): 
     """Initialise the class.""" 
     wx.Frame.__init__(self, None, -1, 'Demonstrate wxPython Rich Text') 
     self.panel = MainPanel(self) 
     self.refresh_rtf(self.raw_xml()) 
     self.Centre() 

    def refresh_rtf(self, xml): 
     handler = wx.richtext.RichTextXMLHandler() 
     rtf_buffer = self.rtf_control.GetBuffer() 
     rtf_buffer.AddHandler(handler) 

     #handler.ImportXML(rtf_buffer, self.rtf_control) 
     #self.rtf_control.Refresh() 

    def raw_xml(self): 
     xml = ('<?xml version="1.0" encoding="UTF-8"?>' 
      '<richtext version="1.0.0.0" xmlns="http://www.wxwidgets.org">' 
      '<paragraphlayout textcolor="#4C4C4C" fontsize="11"' 
          'fontstyle="90"' 
          'fontweight="90" fontunderlined="0"' 
          'fontface="Ubuntu" alignment="1"' 
          'parspacingafter="10" parspacingbefore="0"' 
          'linespacing="10">' 
       '<paragraph>' 
        '<text>"What do we want: "</text>' 
        '<text textcolor="#FF0000">all</text>' 
       '</paragraph>' 
      '</paragraphlayout>' 
     '</richtext>') 
     return xml 


class MainPanel(wx.Panel): 
    """Create a panel class to contain screen widgets.""" 
    def __init__(self, frame): 
     """Initialise the class.""" 
     wx.Panel.__init__(self, frame) 
     rtf_sizer = self._create_rtf_control(frame) 
     main_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     main_sizer.Add(rtf_sizer, flag=wx.ALL, border=10) 
     self.SetSizerAndFit(main_sizer) 

    def _create_rtf_control(self, frame): 
     rtf_style = wx.VSCROLL|wx.HSCROLL|wx.TE_READONLY|wx.BORDER_SIMPLE 
     frame.rtf_control = wx.richtext.RichTextCtrl(self, 
               size=(400, 200), 
               style=rtf_style) 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(frame.rtf_control) 
     return sizer 


if __name__ == '__main__': 
    """Run the application.""" 
    screen_app = wx.App() 
    main_frame = MainFrame() 
    main_frame.Show(True) 
    screen_app.MainLoop() 

*****編輯*****

僅供參考我在這裏補充說,取得的結果的Python 2代碼我想

def refresh_rtf(self, xml): 
    if xml != '': 
     out = StringIO() 
     handler = wx.richtext.RichTextXMLHandler() 
     rtf_buffer = self.rtf_control.GetBuffer() 
     rtf_buffer.AddHandler(handler) 
     out.write(str(xml)) 
     out.seek(0) 
     handler.LoadStream(rtf_buffer, out) 
     self.rtf_control.Refresh() 

Lorem存有悲坐阿梅德,consectetur adipiscing elit。整數如下。 Praesent自由人。 Sed cursus ante dapibus diam。 Sed nisi。在nibh elementum imperdiet上的Nulla quis sem。 Duis sagittis ipsum。

回答

0

我已經把這當做是一件糟糕的事情。我敢肯定,這是可能的,但似乎沒有人能夠指導我

相反,我已經實現了使用

html.HtmlWindow 

修改後的代碼的功能,它的功能完美,方法是:

import wx 
import wx.html as html 


class MainFrame(wx.Frame): 
    """Create MainFrame class.""" 
    def __init__(self): 
     """Initialise the class.""" 
     wx.Frame.__init__(self, None, -1, 'Demonstrate wxPython Html') 
     self.panel = MainPanel(self) 
     self.Centre() 
     self.html_display.SetPage(self.raw_html()) 

    @staticmethod 
    def raw_html(): 
     html = ('<p><font color="#4C4C4C", size=2>What do we want: ' 
        '<font color="#FF0000">all</font>' 
       '</p>') 
     return html 


class MainPanel(wx.Panel): 
    """Create a panel class to contain screen widgets.""" 
    def __init__(self, frame): 
     """Initialise the class.""" 
     wx.Panel.__init__(self, frame) 
     html_sizer = self._create_html_control(frame) 
     main_sizer = wx.BoxSizer(wx.HORIZONTAL) 
     main_sizer.Add(html_sizer, flag=wx.ALL, border=10) 
     self.SetSizerAndFit(main_sizer) 

    def _create_html_control(self, frame): 
     txt_style = wx.VSCROLL|wx.HSCROLL|wx.BORDER_SIMPLE 
     frame.html_display = html.HtmlWindow(self, -1, 
               size=(400, 200), 
               style=txt_style) 
     sizer = wx.BoxSizer(wx.HORIZONTAL) 
     sizer.Add(frame.html_display) 
     return sizer 


if __name__ == '__main__': 
    """Run the application.""" 
    screen_app = wx.App() 
    main_frame = MainFrame() 
    main_frame.Show(True) 
    screen_app.MainLoop() 

轉換原始數據的一些工作,但不是太多