简体   繁体   中英

Wxpython Phoenix - Multiple OnDropFiles boxes with TABS

I have a python 3 (wxpython phoenix) app which has two TABs, each TAB has a OnDropFiles box, but I just can't get it working. I have a simple stripped down example below, which should print the file URL on each drop, but not working, if someone could show a working example please, or point me in the right direcion, I would be very gratefull. I'm using Python 3.10.5 and wxpython 4.2.

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))
            self.fileCheck.setSubmissionDrop(self)

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 = self
        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 = self
        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()

We want this to be event driven, so you should define an event, from wx.lib.newevent .
I assume you want the drop zone to be the textctrl not the whole panel, so it's that that needs to be set as the target.
BIND the event.
In the FileDropTarget class we define the event and fire it.
In each drop event callback, we accept the event as a parameter and unpack whatever we packed into the event.
One last thing, in this case, you are getting back a list .

It's simple but every time you decide to use it, it trips you up, I don't know why.

import wx
import wx.lib.newevent
drop_event, EVT_DROP_EVENT = wx.lib.newevent.NewEvent()

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))

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 = self
        self.selectedFiles = ""

        outputtxt3 = '''Drag and Drop files'''
        wx.StaticText(self, -1, outputtxt3, pos=(25, 180), style=wx.ALIGN_CENTRE)
        self.tc_files = wx.TextCtrl(self, wx.ID_ANY, pos=(28, 200), size=(360, 25))
        self.drop_target = MyFileDropTarget(self)
        self.tc_files.SetDropTarget(self.drop_target)
        self.Bind(EVT_DROP_EVENT, self.setSubmissionDrop)
        self.tc_files.SetFocus()
        self.Show()

    def setSubmissionDrop(self, event):
        """Called by the FileDropTarget when files are dropped"""
        files = event.data
        print("\nprep event", files)
        self.tc_files.SetValue(','.join(files))
        self.selectedFiles = files

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 = self
        self.selectedFiles = ""

        wx.StaticText(self, -1, '''Drag and Drop files''', pos=(25, 10), style=wx.ALIGN_CENTRE)
        self.tc_files = wx.TextCtrl(self, wx.ID_ANY, pos=(25, 30), size=(302, 25))
        self.drop_target = MyFileDropTarget(self)
        self.tc_files.SetDropTarget(self.drop_target)
        self.Bind(EVT_DROP_EVENT, self.setSubmissionDrop)
        self.tc_files.SetFocus()
        self.Show()

    def setSubmissionDrop(self, event):
        """Called by the FileDropTarget when files are dropped"""
        files = event.data
        print("\ncheck event", files)
        self.tc_files.SetValue(','.join(files))
        self.selectedFiles = files



class MyFileDropTarget(wx.FileDropTarget):
    """"""
    def __init__(self, window):
        wx.FileDropTarget.__init__(self)
        self.obj = window

    def OnDropFiles(self, x, y, filenames):
        drp_evt = drop_event(data=filenames)
        wx.PostEvent(self.obj, drp_evt)
        return True

app = wx.App()
ScrolledWindow(None, -1, 'File Prep ')
app.MainLoop()

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM