2015-07-10 1 views
0

Я хочу, чтобы строка xml из расширенного текстового элемента управления содержалась в строковой переменной (для хранения в базе данных). Я могу сохранить файл, а затем прочитать его как строку, но должен быть лучший способ (буфер?).текст из RichTextCtrl

Я попытался

buffer = self.rtc.GetBuffer() 

но как получить строку из буфера?

Может кто-то, пожалуйста, помогите мне. Я искал документацию и примеры, но не могу найти то, что я сделал.

ответ

-1

Это является дополнительным к вышесказанному:

Я сохранил 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 выглядит плавник e (ну, он был сгенерирован обработчиком)

+0

Не могли бы вы включить вывод XML? Вы также можете поставить это в свой вопрос, так как это не совсем ответ. –

+0

Я полагаю, что другой вопрос: что вы читаете с ним? –

+0

sdgfasdgf Psionman

0

Я бы использовал 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> 
+0

Спасибо, Майк. Это похоже на решение моей проблемы. Я попытаюсь реализовать его сейчас – Psionman

 Смежные вопросы

  • Нет связанных вопросов^_^