如何在wxpython RichTextCtrl中更改图像属性对话框

问题描述

当我将图片插入wxPython中的RichTextCtrl并右键单击它时,会出现一个带有“图片”按钮的菜单,并打开“图片属性”对话框。

有没有一种方法可以用该对话框代替我创建的自定义对话框并将图像信息获取到其中?

理想情况下,我想获取图像数据甚至更好的图像文件名。 但是,查看RichTextCtrl生成的xml,我认为无法恢复文件名。但是,如果我可以获取数据,则可以找到图像。

如果您删除Skip(),下面的on_right_click方法能够完全使用该事件并阻止菜单显示,但是我无法找到如何获得有关单击内容的任何信息。

这是python3 wxPython 4.1.0中的示例代码,可让您插入图像并单击它,然后将文档保存为xml:

import wx
import wx.richtext as rt


class RichTextFrame(wx.Frame):
    def __init__(self,*args,**kw):
        wx.Frame.__init__(self,**kw)
        self.make_menu_bar()
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.rtc = rt.RichTextCtrl(self,style=wx.VSCROLL | wx.HSCROLL | wx.NO_BORDER)
        self.sizer.Add(self.rtc,1,flag=wx.EXPAND)
        self.SetSizer(self.sizer)
        rt.RichTextBuffer.AddHandler(rt.RichtextxMLHandler(name="XML",ext="xml",type=99))
        self.Bind(rt.EVT_RICHTEXT_RIGHT_CLICK,self.on_right_click)

    def on_right_click(self,evt):
        # This catches right clicks
        evt.Skip()

    def on_file_save_as(self,evt):
        wildcard,types = rt.RichTextBuffer.GetExtWildcard(save=True)

        dlg = wx.FileDialog(self,"Choose a filename",wildcard=wildcard,style=wx.FD_SAVE)
        if dlg.ShowModal() == wx.ID_OK:
            path = dlg.GetPath()
            if path:
                file_type = types[dlg.GetFilterIndex()]
                ext = rt.RichTextBuffer.FindHandlerByType(file_type).GetExtension()
                if not path.endswith(ext):
                    path += '.' + ext
                self.rtc.SaveFile(path,file_type)
        dlg.Destroy()

    def on_insert_image(self,evt):
        # wx.Image('image.png'),wx.BITMAP_TYPE_PNG)
        self.rtc.WriteImage(wx.Image(200,200))

    def on_file_exit(self,evt):
        self.Close(True)

    def forward_event(self,evt):
        self.rtc.ProcessEvent(evt)

    def make_menu_bar(self):
        def do_bind(item,handler,update_ui=None):
            self.Bind(wx.EVT_MENU,item)
            if update_ui is not None:
                self.Bind(wx.EVT_UPDATE_UI,update_ui,item)

        file_menu = wx.Menu()
        do_bind(file_menu.Append(-1,"&Save\tCtrl+S","Save a file"),self.on_file_save_as)
        do_bind(file_menu.Append(-1,"E&xit\tCtrl+Q","Quit this program"),self.on_file_exit)

        edit_menu = wx.Menu()
        do_bind(edit_menu.Append(-1,'Insert image\tCtrl+i'),self.on_insert_image)

        mb = wx.MenuBar()
        mb.Append(file_menu,"&File")
        mb.Append(edit_menu,"&Edit")
        self.SetMenuBar(mb)


class MyApp(wx.App):
    """
    Main class for running the gui
    """

    def __init__(self):
        wx.App.__init__(self)
        self.frame = None

    def OnInit(self):
        self.frame = RichTextFrame(None,-1,"RichTextCtrl",size=(900,500),style=wx.DEFAULT_FRAME_STYLE)
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

    def OnExit(self):
        print('_Done_')
        return True


if __name__ == "__main__":
    app = MyApp()
    app.MainLoop()

谢谢。

解决方法

我没有设法使它与WriteImage一起使用。但是我通过使用RichTextFieldTypeStandard的自定义子类来解决此问题,该子类可以保存覆盖方法的图像:CanEditProperties,GetPropertiesMenuLabel和EditProperties。
通过在文本中插入这样的字段,EditProperties方法可以访问该字段的名称,该名称可以是磁盘上图像的路径。