如何解决如何在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方法可以访问该字段的名称,该名称可以是磁盘上图像的路径。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。