2017-09-22 16 views
0

フレームがサイズ変更(最大化)されたときに、2つのイメージを並べて配置します。どのように達成するのですか?wxPython - フレームが最大化されたときにイメージのサイズを動的に変更します。

import wx 

class MyFrame2 (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(500,300), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 

     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 

     bSizer11 = wx.BoxSizer(wx.HORIZONTAL) 

     self.m_bitmap3 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"img/im1.jpg", wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer11.Add(self.m_bitmap3, 1, wx.ALL|wx.EXPAND, 5) 

     self.m_bitmap4 = wx.StaticBitmap(self, wx.ID_ANY, wx.Bitmap(u"img/im2.jpg", wx.BITMAP_TYPE_ANY), wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer11.Add(self.m_bitmap4, 1, wx.ALL|wx.EXPAND, 5) 


     self.SetSizer(bSizer11) 
     self.Layout() 

     self.Centre(wx.BOTH) 

    def __del__(self): 
     pass 

app = wx.App(0) 
MyFrame2(None).Show() 
app.MainLoop() 

答えて

1

import wx 

class MyFrame2 (wx.Frame): 

    def __init__(self, parent): 
     wx.Frame.__init__ (self, parent, id = wx.ID_ANY, title = wx.EmptyString, pos = wx.DefaultPosition, size = wx.Size(500,300), style = wx.DEFAULT_FRAME_STYLE|wx.TAB_TRAVERSAL) 
     self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize) 
     bSizer11 = wx.BoxSizer(wx.HORIZONTAL) 
     self.img1=wx.Image("1.bmp", wx.BITMAP_TYPE_ANY) 
     self.img2=wx.Image("1.bmp", wx.BITMAP_TYPE_ANY) 
     self.m_bitmap3 = wx.StaticBitmap(self, wx.ID_ANY, wx.BitmapFromImage(self.img1), wx.DefaultPosition, wx.DefaultSize, 0) 
     bSizer11.Add(self.m_bitmap3, 1, wx.EXPAND, 0) 
     self.m_bitmap4 = wx.StaticBitmap(self, wx.ID_ANY, wx.BitmapFromImage(self.img2)) 
     bSizer11.Add(self.m_bitmap4, 1, wx.EXPAND, 0) 
     self.Bind(wx.EVT_SIZE, self.onResize) 
     self.SetSizer(bSizer11) 
     self.Layout() 
     self.Centre(wx.BOTH) 

    def __del__(self): 
     pass 

    def onResize(self, event): 
     # self.Layout() 
     frame_size = self.GetSize() 
     frame_h = (frame_size[0]-10)/2 
     frame_w = (frame_size[1]-10)/2 
     img1 = self.img1.Scale(frame_h,frame_w) 
     img2 = self.img2.Scale(frame_h,frame_w) 
     self.m_bitmap3.SetBitmap(wx.BitmapFromImage(img1)) 
     self.m_bitmap4.SetBitmap(wx.BitmapFromImage(img2)) 
     self.Refresh() 
     self.Layout() 

app = wx.App(0) 
MyFrame2(None).Show() 
app.MainLoop() 

注:これらは、そうでなければScaleの単一self.Bind
サイズは、フレームサイズの半分に基づいており、画像が元の画像からたびにスケーリングされます徐々にゆがんでます。

+0

それを解決します、ありがとうございました。 –

0

それはあなたがフレームのサイズを変更するときに発生するイベントですので、あなたはwx.EVT_SIZEにバインドする必要があります。そのハンドラでは、イメージのサイズを更新する必要があります。 wx.ImageScale()メソッドを使用して画像のサイズを変更することができます。アスペクト比を維持するような方法で画像を拡大したり、画像が伸びたときに変わって見えるように画像を拡大したりすることをお勧めします。これはうまく画像を拡大縮小するようだが、一番下のボタンがオフのみじん切りなっていることを

import os 
import wx 

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', size=(400, 400)) 
     self.image_loaded = False 
     self.current_size = self.frame.GetSize() 
     self.filepath = None 

     self.panel = wx.Panel(self.frame) 
     self.Bind(wx.EVT_SIZE, self.onResize) 

     self.PhotoMaxSize = self.current_size.GetHeight() - 10 

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

    def createWidgets(self): 
     instructions = 'Browse for an image' 
     img = wx.EmptyImage(240,240) 
     self.imageCtrl = wx.StaticBitmap(self.panel, wx.ID_ANY, 
             wx.BitmapFromImage(img)) 

     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.panel.Layout() 

    def onBrowse(self, event): 
     """ 
     Browse for file 
     """ 
     wildcard = "JPG 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()) 
      self.onView() 
     dialog.Destroy() 

    def scale_image(self): 
     if self.filepath: 
      img = wx.Image(self.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) 
      return img 


    def onView(self): 
     self.filepath = self.photoTxt.GetValue() 
     img = self.scale_image() 
     self.imageCtrl.SetBitmap(wx.BitmapFromImage(img)) 
     self.panel.Refresh() 
     self.image_loaded = True 

    def onResize(self, event): 
     print 'resizing' 
     if self.image_loaded: 
      if self.current_size != self.frame.GetSize(): 
       self.current_size = self.frame.GetSize() 

       self.PhotoMaxSize = self.current_size.GetHeight() - 30 
       img = self.scale_image() 
       self.imageCtrl.SetBitmap(wx.BitmapFromImage(img)) 
       self.panel.Refresh() 
       self.panel.Layout() 


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

注:ここでは

は数年前からフォトビューアのための私の tutorialに緩く基づいた例です。私はなぜ、その瞬間にその問題を診断する時間がないのか分かりませんが、一般的にこれはおそらくあなたがやりたいと思う方法です。あなたペーストビンコードに基づい

+0

どうすればいいかわかりません。コードに親切に提供できますか? –

+0

私は迅速かつ汚れた例を追加しました –

+0

まだそれを完了するのに苦労していますか?私がここで何をしたかを見てください:https://pastebin.com/JN6qwbQr –

関連する問題