【问题标题】:How to change image properties dialog in wxpython RichTextCtrl如何在 wxpython RichTextCtrl 中更改图像属性对话框
【发布时间】:2021-01-07 18:41:30
【问题描述】:

当我在 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, *args, **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, handler, 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()

谢谢。

【问题讨论】:

  • 如果不制作自己的小部件,我认为您无法做到这一点。顺便说一句,您正在捕获的事件 (EVT_RICHTEXT_RIGHT_CLICK) 是指小部件的事件,而不是其内容(图像或其他)。它们是不同的东西。

标签: python user-interface wxpython wxwidgets


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-06
    • 2011-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多