当我在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()
谢谢
我没能在WriteImage上实现这一点。但我确实通过使用RichTextFieldTypeStandard的自定义子类解决了这个问题,该子类可以保存一个覆盖方法的图像:CanEditProperties、GetPropertiesMenuLabel和EditProperties。
通过在文本中插入这样的字段,EditProperties方法可以访问字段的名称,该名称可以是磁盘上图像的路径
相关问题 更多 >
编程相关推荐