来自 RichTextCtrl 的文本

text from RichTextCtrl

我想将富文本控件中的 xml 字符串转换为字符串变量(以存储在数据库中)。我可以保存到文件,然后将其作为字符串读回,但必须有更好的方法(缓冲区?)。

我试过了

  buffer = self.rtc.GetBuffer()

但是如何从缓冲区中获取字符串?

有人可以帮助我吗?我搜索了文档和示例,但找不到我需要的内容。

我会使用 StringIO 写入数据,然后打印出来。如果你这样做,那么你只需写入内存,这比从磁盘读取快得多。我找到了一个 example 可以完成你想要的大部分功能,但其中有很多额外的垃圾,所以我将该示例缩减为以下内容:

import wx
import wx.richtext

from StringIO import StringIO


########################################################################
class MyFrame(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, title='Richtext Test')

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.rt = wx.richtext.RichTextCtrl(self)
        self.rt.SetMinSize((300,200))

        save_button = wx.Button(self, label="Save")
        save_button.Bind(wx.EVT_BUTTON, self.on_save)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.rt, 1, wx.EXPAND|wx.ALL, 6)
        sizer.Add(save_button, 0, wx.EXPAND|wx.ALL, 6)

        self.SetSizer(sizer)
        self.Show()

    #----------------------------------------------------------------------
    def on_save(self, event):
        out = StringIO()
        handler = wx.richtext.RichTextXMLHandler()
        rt_buffer = self.rt.GetBuffer()
        handler.SaveStream(rt_buffer, out)
        out.seek(0)
        self.xml_content = out.read()
        print self.xml_content


if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

UPDATE - 只是为了好玩,我决定通过将 XML 写入文件然后读回并解析出任何文本来扩展这个例子输入:

import wx
import wx.richtext

from lxml import objectify
from StringIO import StringIO


########################################################################
class MyFrame(wx.Frame):

    #----------------------------------------------------------------------
    def __init__(self):
        wx.Frame.__init__(self, None, title='Richtext Test')

        sizer = wx.BoxSizer(wx.VERTICAL)
        self.rt = wx.richtext.RichTextCtrl(self)
        self.rt.SetMinSize((300,200))

        save_button = wx.Button(self, label="Save")
        save_button.Bind(wx.EVT_BUTTON, self.on_save)

        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(self.rt, 1, wx.EXPAND|wx.ALL, 6)
        sizer.Add(save_button, 0, wx.EXPAND|wx.ALL, 6)

        self.SetSizer(sizer)
        self.Show()


    def on_save(self, event):
        out = StringIO()
        handler = wx.richtext.RichTextXMLHandler()
        rt_buffer = self.rt.GetBuffer()
        handler.SaveStream(rt_buffer, out)
        out.seek(0)
        self.xml_content = out.read()
        print self.xml_content

        with open("test.xml", "w") as xml_file:
            xml_file.write(self.xml_content)

        self.parse_xml()

    def parse_xml(self):
        '''
        Parse the XML with the lxml module
        '''
        with open("test.xml") as xml_file:
            xml = xml_file.read()

        root = objectify.fromstring(xml)
        print root.paragraphlayout.paragraph.getchildren()[0]


if __name__ == "__main__":
    app = wx.App(False)
    frame = MyFrame()
    app.MainLoop()

请注意,lxml 模块不是 Python 的一部分,但可以轻松获取 here

这是一些例子 XML 我在 运行 这个程序时得到的:

<?xml version="1.0" encoding="UTF-8"?>
<richtext version="1.0.0.0" xmlns="http://www.wxwidgets.org">
  <paragraphlayout textcolor="#3C3C3C" fontsize="10" fontstyle="90" fontweight="90" fontunderlined="0" fontface="Droid Sans" alignment="1"    parspacingafter="10" parspacingbefore="0" linespacing="10">
    <paragraph>
      <text>glgfh</text>
    </paragraph>
  </paragraphlayout>
</richtext>

这是对上述内容的补充:

我已经按照需要保存了 xml,但是当我读回它时出现错误:

XML parsing error: 'no element found' at line 1

我的密码是

def OnLstStrategyDClick(self,e):
  index=e.GetSelection()
  self.txtStrategyID.SetValue(self.StrategyList[index][0])
  self.txtDescription.SetValue(self.StrategyList[index][1])
  #print self.StrategyList[index][2]

  out = StringIO()
  handler = wx.richtext.RichTextXMLHandler()
  buffer = self.txtBidStrategy.GetBuffer()
  buffer.AddHandler(handler)
  out.write(self.StrategyList[index][2])
  out.seek(0)
  handler.LoadStream(buffer, out)
  self.txtBidStrategy.Refresh()

  self.txtBidStrategy.SetValue(self.StrategyList[index][2])

xml代码看起来不错(好吧,它已经由处理程序生成)