画像表示サンプル

ハードディスク発掘していたら微妙なコードが出てきたので書き直してメモ

#!/usr/bin/python
# -*- coding: utf-8 -*-
import wx
import os


class ImagePanel(wx.Panel):
  def __init__(self, parent):
    super(ImagePanel, self).__init__(parent)
    self.bmp=None
    self.Bind(wx.EVT_PAINT, self.OnPaint)

  def OnPaint(self, event):
    if self.bmp:
      dc = wx.PaintDC(self)
      dc.DrawBitmap(self.bmp, 0, 0, True)
    else:
      dc = wx.PaintDC(self)
      dc.DrawText("open a image file", 0, 0)    

  def load(self, path):
    if not os.path.exists(path):
      print 'no such file: %s'
      return False
    wximage=wx.Image(path)
    self.bmp = wximage.ConvertToBitmap()
    self.Refresh()
    return True
    

class MyFrame(wx.Frame):
  def __init__(self, parent, ID, title):
    super(MyFrame, self).__init__(parent, ID, title, size=wx.Size(200, 150))
    # sizer
    sizer=wx.BoxSizer(wx.VERTICAL)
    self.SetSizer(sizer)
    self.SetAutoLayout(True)
    # interface
    tb=self.setupToolbar()
    sizer.Add(tb, 0, wx.EXPAND)
    self.setupMenu()
    self.CreateStatusBar()
    # image
    self.panel=ImagePanel(self)
    sizer.Add(self.panel, 1, wx.EXPAND)
    # event handler
    self.Bind(wx.EVT_MENU, lambda e: self.fileOpen(), id=wx.ID_OPEN)
    self.Bind(wx.EVT_MENU, lambda e: self.Close(), id=wx.ID_EXIT)

  def setupMenu(self):
    menuBar = wx.MenuBar()
    menuBar.Append(self.setupFileMenu(), '&File')
    self.SetMenuBar(menuBar)

  def setupFileMenu(self):
    menu = wx.Menu()
    # open
    menu.Append(wx.ID_OPEN, '&Open', 'Open a image file')
    # separator
    menu.AppendSeparator()
    # exit
    menu.Append(wx.ID_EXIT, 'E&xit', 'Terminate the program')
    return menu

  def setupToolbar(self):
    tsize = (24,24)
    tb = wx.ToolBar(self, style=wx.TB_HORIZONTAL)
    tb.SetToolBitmapSize(tsize)
    # open
    tb.AddLabelTool(wx.ID_OPEN, '&Open',
        wx.ArtProvider.GetBitmap(wx.ART_FILE_OPEN, wx.ART_TOOLBAR, tsize), 
        shortHelp='Open a image file', longHelp='Open a image file')
    tb.Realize()
    return tb

  def fileOpen(self):
    dialog = wx.FileDialog(self, "Choose a image file", "", "", 
        "|".join([
          "ALL files (*.*)|*.*",
          "JPEG files (*.jpg)|*.jpg",
          "GIF files (*.gif)|*.gif",
          "BMP files (*.bmp)|*.bmp",
          "PNG files (*.png)|*.png",
          ]
          ) , wx.OPEN)
    try:
      if dialog.ShowModal() == wx.ID_OK:
        path=dialog.GetPath()
        if self.panel.load(path):
          print 'open %s' % path
          self.SetTitle(path)
    finally:
      dialog.Destroy()    


class MyApp(wx.App):
  def OnInit(self):
    frame = MyFrame(None, -1, "Image viewer")
    frame.Show(True)
    self.SetTopWindow(frame)
    return True


if __name__=="__main__":
  app = MyApp(0)
  app.MainLoop()