WxPython Phoenix多标签页OnDropFiles功能失效求助
WxPython Phoenix标签页拖放文件功能修复方案
问题定位
原代码存在两个关键错误导致拖放功能失效:
switchSize方法中错误调用self.fileCheck.setSubmissionDrop(self),该方法是拖放回调专用,手动传入Frame对象会干扰正常逻辑PrepFile和CheckFile类中self.frame = self的赋值无意义,虽不直接导致拖放失效,但属于代码冗余错误
修复后的完整代码
import wx class ScrolledWindow(wx.Frame): def __init__(self, parent, id, title): wx.Frame.__init__(self, parent, id, title, size=(510, 330), style=wx.DEFAULT_FRAME_STYLE & ~ (wx.RESIZE_BORDER | wx.MAXIMIZE_BOX)) run_params = {} self.tabbed = wx.Notebook(self, -1, style=(wx.NB_TOP)) self.filePrep = PrepFile(self.tabbed, self, run_params) self.fileCheck = CheckFile(self.tabbed, self, run_params) self.tabbed.AddPage(self.filePrep, "File Prep") self.tabbed.AddPage(self.fileCheck, "File Check") self.Bind(wx.EVT_NOTEBOOK_PAGE_CHANGED, self.switchSize) self.Centre() self.Show() def switchSize(self, e): page = self.tabbed.GetPageText(self.tabbed.GetSelection()) if page == 'File Prep': self.SetSize((510, 330)) elif page == 'File Check': self.SetSize((510, 510)) # 移除错误的setSubmissionDrop调用 class PrepFile(wx.Panel): def __init__(self, parent, frame, run_params): wx.Panel.__init__(self, parent) self.run_params = run_params self.parent = parent self.frame = frame # 修正为传入的frame对象 self.selectedFiles = "" outputtxt3 = '''Drag and Drop files''' wx.StaticText(self, -1, outputtxt3, pos=(25, 180), style=wx.ALIGN_CENTRE) self.drop_target = MyFileDropTarget(self) self.SetDropTarget(self.drop_target) self.tc_files = wx.TextCtrl(self, wx.ID_ANY, pos=(28, 200), size=(360, 25)) self.tc_files.SetFocus() self.Show() def setSubmissionDrop(self, dropFiles): """Called by the FileDropTarget when files are dropped""" print(dropFiles) self.tc_files.SetValue(','.join(dropFiles)) self.selectedFiles = dropFiles class CheckFile(wx.Panel): def __init__(self, parent, frame, run_params): wx.Panel.__init__(self, parent) self.run_params = run_params self.parent = parent self.frame = frame # 修正为传入的frame对象 self.selectedFiles = "" wx.StaticText(self, -1, '''Drag and Drop files''', pos=(25, 10), style=wx.ALIGN_CENTRE) self.drop_target = MyFileDropTarget(self) self.SetDropTarget(self.drop_target) self.tc_files = wx.TextCtrl(self, wx.ID_ANY, pos=(25, 30), size=(302, 25)) self.tc_files.SetFocus() self.Show() def setSubmissionDrop(self, dropFiles): """Called by the FileDropTarget when files are dropped""" print(dropFiles) self.selectedFiles = dropFiles class MyFileDropTarget(wx.FileDropTarget): """""" def __init__(self, window): wx.FileDropTarget.__init__(self) self.window = window def OnDropFiles(self, x, y, filenames): print(filenames) self.window.setSubmissionDrop(filenames) return True app = wx.App() ScrolledWindow(None, -1, 'File Prep ') app.MainLoop()
关键修复说明
- 移除错误的方法调用:删除
switchSize中self.fileCheck.setSubmissionDrop(self),该调用会传入Frame对象而非拖放的文件列表,导致回调逻辑混乱 - 修正Frame引用:将
PrepFile和CheckFile中的self.frame = self改为self.frame = frame,确保正确持有父Frame的引用(虽不直接影响拖放,但符合代码规范) - 保留原有拖放逻辑:原
MyFileDropTarget的实现是正确的,修复后拖放文件时会正常打印路径并更新文本框内容
内容的提问来源于stack exchange,提问作者speedyrazor
相关产品推荐
相关产品推荐

