在wxPython中使用vb6 RichText控件

2024-09-30 05:27:45 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用wxPython 2.8.12.1Python 2.7创建了一个富文本编辑器(richtext.RichTextCtrl)。通过使用PyRTFParser,我实现了对一些RTF内容和图像的处理。它还支持RTF和图像的复制粘贴。在

问题是所有客户端数据库都包含使用VB 6 RichText control存储的RTF数据。当我将这些数据加载到我的RichTextCtrl中时,它不支持表,丢失了一些格式和项目符号,并显示图像错误(Windows元数据文件)。在

我必须提供一个工具,它可以将数据库中的旧数据(使用VB 6 RichText control)显示到wxPython中。在

wx.TextCtrl提供TE_RICH和{}功能,但不提供检索RTF内容的方法。它也不支持图像。在

考虑以下几点:

这是我从中复制内容的word文档。Word Document to Copy content from

这是VB 6 RichText control中的粘贴结果。Content pasted in VB 6 RichText control

这是wx.TextCtrlTE_RICH2的粘贴结果。提供更好的图像。

这是richtext.RichTextCtrl中的粘贴结果。表格数据混乱,格式丢失。Content pasted in richtext.RichTextCtrl

有没有什么解决方案可以支持wx.TextCtrl中的图像以及从中获取RTF内容形式? 或者有什么方法可以直接在wxpython中使用VB 6 RichText control?在

RTF内容示例(存储在数据库中):

{\rtf1\fbidis\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fswiss\fprq2\fcharset0 Calibri;}{\f1\froman\fprq2\fcharset0 Times New Roman;}{\f2\froman\fprq2\fcharset2 Symbol;}{\f3\froman\fprq2\fcharset0 Cambria;}{\f4\fnil\fcharset0 MS Sans Serif;}}
{\colortbl ;\red0\green0\blue0;\red151\green72\blue7;\red54\green95\blue145;}
{\stylesheet{ Normal;}{\s1 heading 1;}}
\viewkind4\uc1\trowd\trgaph108\trleft-15\clbrdrt\brdrw15\brdrs\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\pard\intbl\ltrpar\sl276\slmult1\cf1\b\f0\fs24 Categor Limits\cell\cf0\b0\f1\fs20\row
\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\pard\intbl\ltrpar\sl276\slmult1\cf2\b\f0\fs22 Lower Limit\cell Sales Category\cell\cf0\b0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 0\cell Poor\cell\cf0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 1000\cell Average\cell\cf0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 5000\cell Good\cell\cf0\f1\fs20\row
\cf1\f0\fs22\trowd\trgaph108\trleft-15\clbrdrl\brdrw15\brdrs\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx1335\clbrdrb\brdrw15\brdrs\clbrdrr\brdrw15\brdrs \cellx3005\intbl 7000\cell Excellent\cell\cf0\f1\fs20\row
\pard\ltrpar\sa200\sl276\slmult1\f0\fs22 
\par \pard\ltrpar\fi-360\li720\sa200\sl276\slmult1\f2\'b7\tab\f0 Item 1
\par \f2\'b7\tab\f0 Item 2
\par \pard\ltrpar\keep\keepn\s1\sb480\sl276\slmult1\cf3\b\f3\fs28 Colorful Text here\'85
\par \pard\ltrpar\cf0\b0\f4\fs17 
\par }

Tags: 图像cellf1rtff0clbrdrrtrowdtrleft
3条回答

很多网页告诉你怎么做。搜索python COM

import win32com.client
xl = win32com.client.Dispatch("Excel.Application")

是从第一页开始的

对于API调用,您使用pywin32扩展。在

有点像

^{pr2}$

但我不了解python,这是从google收集到的2分钟知识的极限。在

VB6是ANSI RTF。ie无UNICODE。它也很旧,许多新版本已经发布。

这是如何访问新版本的。它创建一个RTF窗口,发送一条消息以获得COM接口,然后通过TOM(文本对象模型)使用它。

    Ret = LoadLibrary("c:\windows\system32\MSFTEDIT.dll")
    If Ret = 0 Then MsgBox "Load Lib " & Err.LastDllError
    Flags = WS_CHILD + WS_HSCROLL + WS_VSCROLL + WS_VISIBLE + ES_MULTILINE + ES_AUTOHSCROLL + ES_AUTOVSCROLL + ES_NOHIDESEL + ES_WANTRETURN
    Dim barray() As Byte
    barray = "RICHEDIT50W" & vbNullChar
    gRtfHwnd = CreateWindowEx(WS_EX_ACCEPTFILES + WS_EX_CLIENTEDGE, barray(0), "", Flags, 0, 0, ScaleX(Me.ScaleWidth, vbTwips, vbPixels), ScaleY(Me.ScaleHeight, vbTwips, vbPixels), Me.hWnd, vbNull, App.hInstance, vbNull)

    Ret = SendMessageByVal(gRtfHwnd, EM_SETTEXTMODE, TM_MULTILEVELUNDO + TM_PLAINTEXT + TM_MULTICODEPAGE, 0)
    If GetTextMode(gRtfHwnd) <> 41 Then MsgBox "get Text mode = " & GetTextMode(gRtfHwnd)
    Ret = SendMessageByVal(gRtfHwnd, EM_SETEDITSTYLE, SES_ALLOWBEEPS + SES_USECRLF, SES_ALLOWBEEPS + SES_USECRLF)
    Ret = SendMessageByVal(gRtfHwnd, EM_SETLANGOPTIONS, IMF_None, IMF_None)
    If GetTextMode(gRtfHwnd) <> 41 Then MsgBox "get Text mode (2) = " & GetTextMode(gRtfHwnd)
    Ret = SendMessageByVal(gRtfHwnd, EM_SETTYPOGRAPHYOPTIONS, TO_None, TO_None)
    'Below is the default anyway with CreateWin flags spec above
    Ret = SendMessageByVal(gRtfHwnd, EM_SETOPTIONS, ECO_AUTOHSCROLL + ECO_AUTOVSCROLL + ECO_NOHIDESEL + ECO_WANTRETURN, ECOOP_OR)


Dim ParaFormat As ITextPara
Dim FontFormat As ITextFont
Ret = SendMessageAny(gRtfHwnd, EM_GETOLEINTERFACE, 0, TomObj)
Set TomDoc = TomObj

实际上,使用控件来创建窗口的技术并不是必需的。这允许您在RTF的更高版本中使用该功能,同时仍然使用本机VB6 RTF控件。有关详细信息,请参见this。在

相关问题 更多 >

    热门问题