Last active
October 23, 2017 13:26
-
-
Save driscollis/2bdc9ede4e31e724fef6e44220cfabce to your computer and use it in GitHub Desktop.
DnD image viewer
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment