2017-10-20 57 views
0

まず、thisがwxPythonで作成しようとしているものです。 「写真1」というラベルの付いた領域でドラッグした画像を受け入れることができます。画像がドラッグされると、その画像のサムネイルに置き換えられます。私はwxPythonで "Drag and Drop"を研究しましたが、私がこれを行うために必要なツールを見つけることができないようです。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エクスプローラからファイルをドラッグしていますwxPythonを4.ノートでWindows 7上で私のために働きました。

+0

ありがとうございました!私が見つけた唯一の問題は、BitmapFromImageへの呼び出しが償却されたことでした。 (私は、Python 3.6.3でwxPythonの最新バージョンを使用していると思います)。 –

+1

私はすべての非難されたものを得たと思った。私は、これらの警告を修正するコードを更新しました。 –

+0

非常に広範な答えは、それまでのところ得ているより多くのクレジットを値する。 – Montmons

関連する問題