2017-10-20 46 views
0

首先,this就是我试图用wxPython所做的。我希望标有“图片1”的区域能够接受拖动的图像,然后当拖动图像时,将其替换为该图像的缩略图。我研究了wxPython中的“拖放”,但我似乎无法找到所需的工具来执行此操作。在wxPython中为图像创建拖放界面

任何帮助让我开始正确的轨道将不胜感激。

回答

1

您将需要Pillow package来创建缩略图。另一件你会想要的是最有可能的wx.FileDropTarget类。最后我做了以下内容:

import os 
import wx 

from PIL import Image 
from wx.lib.pubsub import pub 

PhotoMaxSize = 240 


class DropTarget(wx.FileDropTarget): 

    def __init__(self, widget): 
     wx.FileDropTarget.__init__(self) 
     self.widget = widget 

    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 


class PhotoCtrl(wx.App): 
    def __init__(self, redirect=False, filename=None): 
     wx.App.__init__(self, redirect, filename) 
     self.frame = wx.Frame(None, title='Photo Control') 

     self.panel = wx.Panel(self.frame) 
     pub.subscribe(self.update_image_on_dnd, 'dnd') 

     self.PhotoMaxSize = 240 

     self.createWidgets() 
     self.frame.Show() 

    def createWidgets(self): 
     instructions = 'Browse for an image' 
     img = wx.Image(240,240) 
     self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, 
             wx.Bitmap(img)) 
     filedroptarget = DropTarget(self) 
     self.imageCtrl.SetDropTarget(filedroptarget) 

     instructLbl = wx.StaticText(self.panel, label=instructions) 
     self.photoTxt = wx.TextCtrl(self.panel, size=(200,-1)) 
     browseBtn = wx.Button(self.panel, label='Browse') 
     browseBtn.Bind(wx.EVT_BUTTON, self.onBrowse) 

     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer = wx.BoxSizer(wx.HORIZONTAL) 

     self.mainSizer.Add(wx.StaticLine(self.panel, wx.ID_ANY), 
          0, wx.ALL|wx.EXPAND, 5) 
     self.mainSizer.Add(instructLbl, 0, wx.ALL, 5) 
     self.mainSizer.Add(self.imageCtrl, 0, wx.ALL, 5) 
     self.sizer.Add(self.photoTxt, 0, wx.ALL, 5) 
     self.sizer.Add(browseBtn, 0, wx.ALL, 5) 
     self.mainSizer.Add(self.sizer, 0, wx.ALL, 5) 

     self.panel.SetSizer(self.mainSizer) 
     self.mainSizer.Fit(self.frame) 

     self.panel.Layout() 

    def onBrowse(self, event): 
     """ 
     Browse for file 
     """ 
     wildcard = "JPEG files (*.jpg)|*.jpg" 
     dialog = wx.FileDialog(None, "Choose a file", 
           wildcard=wildcard, 
           style=wx.OPEN) 
     if dialog.ShowModal() == wx.ID_OK: 
      self.photoTxt.SetValue(dialog.GetPath()) 
     dialog.Destroy() 
     self.onView() 

    def update_image_on_dnd(self, filepath): 
     self.onView(filepath=filepath) 

    def onView(self, filepath=None): 
     if not filepath: 
      filepath = self.photoTxt.GetValue() 

     img = wx.Image(filepath, wx.BITMAP_TYPE_ANY) 
     # scale the image, preserving the aspect ratio 
     W = img.GetWidth() 
     H = img.GetHeight() 
     if W > H: 
      NewW = self.PhotoMaxSize 
      NewH = self.PhotoMaxSize * H/W 
     else: 
      NewH = self.PhotoMaxSize 
      NewW = self.PhotoMaxSize * W/H 
     img = img.Scale(NewW,NewH) 

     self.imageCtrl.SetBitmap(wx.Bitmap(img)) 
     self.panel.Refresh() 

if __name__ == '__main__': 
    app = PhotoCtrl() 
    app.MainLoop() 

这与wxPython的为我工作在Windows 7上。注意,我拖着从Windows资源管理器的文件到我的wxPython应用程序的形象窗口小部件。

+0

非常感谢!我发现的唯一问题是对BitmapFromImage的调用已被折旧。 (我相信我在Python 3.6.3中使用了最新版本的wxPython)。 –

+1

我以为我得到了所有弃用的东西。我只是更新了代码来修复这些警告。 –

+0

非常广泛的答案,值得更多的信贷,然后它已经得到了迄今。 – Montmons