简体   繁体   中英

wxPython Drag and Drop files onto image, to add to array

I have a simple wxPython application with 1 image "Drop files here!" and 2 buttons.

I want the user to be able to drag and drop files onto the top section/image, at which point the image changes and the files are loaded into an array.

That's all I need but I have hit a major roadblock getting the drag and drop to work. Can someone please take a look at my code and figure out how/where to integrate the Drag and drop event? Any help would be great.

UI image

import wx

class DropTarget(wx.FileDropTarget):

    def OnDropFiles(self, x, y, filenames):
        print(filenames)

        image = Image.open(filenames[0])
        image.thumbnail((PhotoMaxSize, PhotoMaxSize))
        image.save('thumbnail.png')
        pub.sendMessage('dnd', filepath='thumbnail.png')
        return True

    def __init__(self, parent, ID, title):
        wx.FileDropTarget.__init__(self, parent, ID, title, size=(300, 340), style= wx.CLOSE_BOX)
        #self.widget = widget

class MyFrame(wx.Frame):

    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title, size=(300, 340), style= wx.CLOSE_BOX)


        panel1 = wx.Panel(self,-1, style=wx.SUNKEN_BORDER)
        panel2 = wx.Panel(self,-1, style=wx.SUNKEN_BORDER)

        panel1.SetBackgroundColour("BLUE")
        panel2.SetBackgroundColour("RED")

        image_file = 'bgimage1.png'
        bmp1 = wx.Image(
            image_file,
            wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        # image's upper left corner anchors at panel
        # coordinates (0, 0)
        self.bitmap1 = wx.StaticBitmap(
            self, -1, bmp1, (0, 0))
        # show some image details
        str1 = "%s  %dx%d" % (image_file, bmp1.GetWidth(),
                          bmp1.GetHeight())

        # button
        closeButton = wx.Button(self.bitmap1, label='Generate', pos=(30, 280))
        closeButton.Bind(wx.EVT_BUTTON, self.OnClose)

        clearButton = wx.Button(self.bitmap1, label='Clear', pos=(170, 280))
        clearButton.Bind(wx.EVT_BUTTON, self.OnClose)


        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(panel1, 5, wx.EXPAND)
        box.Add(panel2, 1, wx.EXPAND)

        self.SetAutoLayout(True)
        self.SetSizer(box)
        self.Layout()

    def OnDropFiles(self, x, y, filenames):
        self.window.updateDisplay(filenames)
        for name in filenames:
            self.window.WriteText(name + "\n")
            print(name)

        return True

    def OnClose(self, e):
        self.Close(True)

app = wx.App()
frame = MyFrame(None, -1, "Sizer Test")
frame.Show()
app.MainLoop()

You have the class DropTarget back to front with the init after the dropfiles. You also need to put the image and buttons on to one of the panels.
See below:

import wx

class DropTarget(wx.FileDropTarget):
    def __init__(self, obj):
        wx.FileDropTarget.__init__(self)
        self.obj = obj

    def OnDropFiles(self, x, y, filenames):
        print("Drop Event",filenames)

#        image = Image.open(filenames[0])
#        image.thumbnail((PhotoMaxSize, PhotoMaxSize))
#        image.save('new.png')
#        pub.sendMessage('dnd', filepath='new.png')
        return True

class MyFrame(wx.Frame):

    def __init__(self, parent, ID, title):
        wx.Frame.__init__(self, parent, ID, title, size=(300, 340))


        panel1 = wx.Panel(self,-1, style=wx.SUNKEN_BORDER)
        panel2 = wx.Panel(self,-1, style=wx.SUNKEN_BORDER)

        panel1.SetBackgroundColour("BLUE")
        panel2.SetBackgroundColour("RED")

        image_file = 'bgimage1.png'
        bmp1 = wx.Image(image_file,wx.BITMAP_TYPE_ANY).ConvertToBitmap()
        self.bitmap1 = wx.StaticBitmap(panel1, -1, bmp1, (0, 0))

        # button
        closeButton = wx.Button(panel2, -1, label='Generate',pos=(30, 280))
        closeButton.Bind(wx.EVT_BUTTON, self.OnClose)

        clearButton = wx.Button(panel2, -1, label='Clear',pos=(170, 280))
        clearButton.Bind(wx.EVT_BUTTON, self.OnClose)

        self.file_drop_target = DropTarget(self)
        self.SetDropTarget(self.file_drop_target)

        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(panel1, 0, wx.EXPAND,0)
        box.Add(panel2, 0, wx.EXPAND,0)

        self.SetAutoLayout(True)
        self.SetSizer(box)
        self.Layout()

    def OnClose(self, e):
        self.Close(True)

app = wx.App()
frame = MyFrame(None, -1, "Sizer Test")
frame.Show()
app.MainLoop()

This may not be what you want to achieve but at least it's a startiing point and the drag and drop works.

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