2017-10-21 144 views
0

J'utilise un contrôle rtf pour afficher du texte. Je ne peux pas comprendre la structure de l'objet de contrôle rtf. Comment obtenez-vous du texte dans le tampon rtf?Utilisation du contrôle de texte enrichi wxPython

J'ai accédé au tampon et ajouté un gestionnaire de xml. Où vais-je à partir de là?

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

***** ***** EDIT

Pour référence, j'ai ajouté ici le code Python 2 qui a obtenu le résultat que je veux

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 ipsum dolor sit amet , consectetur adipiscing elit. Entier nec odio. Praesent libero. Sed cursus ante dapibus diam. Sed nisi. Nulla quis sem à nibh elementum imperdiet. Duis sagittis ipsum.

Répondre

0

J'ai abandonné cela comme un mauvais travail. Je suis sûr qu'il est possible, mais personne ne semble être en mesure de me guider

Au lieu de cela, je l'ai mis en place la fonctionnalité en utilisant

html.HtmlWindow 

Le code révisé, qui fonctionne parfaitement, est:

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

Un peu de travail pour convertir les données brutes, mais pas trop