我现有的 wxPython 应用程序基于 wxFormBuilder 骨架。 它将接受新的图像文件并通过文件选择器对话框进行处理。 现在,我想让拖放功能可用,但我不知道如何去做。 在检查了图像面板的属性选项后,我看到了“drop_accept_files”选项。当我选中该框并生成 Python 代码时,我确实看到为此生成了新代码
self.m_panelImage = wx.Panel( self.m_splitterMain, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TAB_TRAVERSAL )
self.m_panelImage.DragAcceptFiles( True ) **<<<< new line of added code**
所有这些听起来都非常有前途和有趣,但我一直无法弄清楚如何连接到这个设施并使用它。 任何人都可以为我指明正确的方向,或者知道一个可以回顾的好例子吗? TIA
一旦你说 wxFormBuilder,我的目光就会变得呆滞,因为我总是直接编码,所以这可能有帮助,也可能没有帮助。
您需要绑定到
EVT_DROP_EVENT
才能知道某些内容已被删除,并设置 target
来处理删除的内容。
这是一个示例,遗憾的是没有涉及 wxFrameBuilder:
import wx
import wx.lib.newevent
drop_event, EVT_DROP_EVENT = wx.lib.newevent.NewEvent()
class FileDropTarget(wx.FileDropTarget):
def __init__(self, obj, multiple_allowed=False):
wx.FileDropTarget.__init__(self)
self.obj = obj
self.multiple_allowed = multiple_allowed
def OnDropFiles(self, x, y, filenames):
filename = filenames[0]
evt = drop_event(data=filename)
wx.PostEvent(self.obj, evt)
return True
class MyFrame(wx.Frame):
def __init__(self, parent, title):
super(MyFrame, self).__init__(parent, style = wx.DEFAULT_FRAME_STYLE,
title=title, size=(500, 500))
self.panel = wx.Panel(self, size = (-1, -1))
self.bmp = wx.Bitmap()
self.bitmap = wx.StaticBitmap(self.panel, -1, self.bmp)
self.file_drop_target = FileDropTarget(self, multiple_allowed=False)
self.SetDropTarget(self.file_drop_target)
self.Bind(EVT_DROP_EVENT, self.OnDropEvent)
def OnDropEvent(self, event):
drop_filename = event.data
self.bitmap.SetBitmap(wx.Bitmap(drop_filename, wx.BITMAP_TYPE_ANY))
self.Refresh()
return
if __name__ == "__main__":
app = wx.App()
MainFrame = MyFrame(None, title = "Drop Image")
MainFrame.Show()
MainFrame.Centre()
app.MainLoop()