You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WxPython Phoenix多标签页OnDropFiles功能失效求助

WxPython Phoenix标签页拖放文件功能修复方案

问题定位

原代码存在两个关键错误导致拖放功能失效:

  1. switchSize方法中错误调用self.fileCheck.setSubmissionDrop(self),该方法是拖放回调专用,手动传入Frame对象会干扰正常逻辑
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 00:24:29