2014-10-29 46 views
-2

我想用wxPython創建一個簡單的圖片瀏覽器。我正在使用一個面板和一個按鈕,通過點擊一個圖片將顯示在一個目錄(圖片)。以下是代碼。我從不同的網站上截取了部分內容。wxPython ImageViewer

我的問題是如果我最大化窗口,圖片瀏覽器以及按鈕保持不變。我希望圖片瀏覽器也增加。

另一件事是,我按下「加載」按鈕後,它向左移動。我如何解決這兩個問題?

我明白以上2個問題,這麼大的程序可能是不必要的。我是Python的新手。

在此先感謝。

import wx, os 

class Panel1(wx.Panel): 
    def __init__(self, *args, **kwds): 
     wx.Panel.__init__(self, *args, **kwds) 
     self.jpgs = self.GetJpgList("./Images") 
     self.CurrentJpg = 0 
     self.MaxImageSize = 200 
     self.img = wx.EmptyImage(self.MaxImageSize,self.MaxImageSize) 
     self.imageCtrl = wx.StaticBitmap(self, wx.ID_ANY, wx.BitmapFromImage(self.img)) 
     self.button_1 = wx.Button(self, wx.ID_ANY, "Load") 
     self.Bind(wx.EVT_BUTTON, self.OnLoad, self.button_1) 
     self.__do_layout() 
     self.Layout() 

    def GetJpgList(self, dir): 
     jpgs = [f for f in os.listdir(dir) if f[-4:] == ".JPG"] 
     return [os.path.join(dir, f) for f in jpgs] 

    def __do_layout(self): 
     sizer_1 = wx.BoxSizer(wx.HORIZONTAL) 
     sizer_2 = wx.BoxSizer(wx.VERTICAL) 
     sizer_1.Add((1,1),1) 
     sizer_1.Add(self.imageCtrl, 0, wx.ALL|wx.EXPAND, 5) 
     sizer_1.Add((1,1),1) 
     sizer_1.Add(wx.StaticLine(self, wx.ID_ANY), 0, wx.ALL|wx.EXPAND, 5) 
     sizer_2.Add(self.button_1, 0, wx.ALL|wx.TOP, 5) 
     sizer_1.Add(sizer_2, 0, wx.ALL, 5) 
     self.SetSizer(sizer_1) 
     sizer_1.Fit(self) 

    def OnNext(self, event): 
     path = self.jpgs[self.CurrentJpg] 
     self.Img = wx.Image(path, wx.BITMAP_TYPE_ANY) 
     W = self.Img.GetWidth() 
     H = self.Img.GetHeight() 
     if W > H: 
      NewW = self.MaxImageSize 
      NewH = self.MaxImageSize * H/W 
     else: 
      NewH = self.MaxImageSize 
      NewW = self.MaxImageSize * W/H 
     self.Img = self.Img.Scale(NewW,NewH) 
     self.imageCtrl.SetBitmap(wx.BitmapFromImage(self.Img)) 
     #self.Fit() 
     #self.Layout() 
     self.Refresh() 

     self.CurrentJpg += 1 
     if self.CurrentJpg > len(self.jpgs) -1: 
      self.CurrentJpg = 0 

# end of class Panel1 

class Frame1(wx.Frame): 
    def __init__(self, *args, **kwds): 
     wx.Frame.__init__(self, *args, **kwds) 
     self.__set_properties() 
     self.__do_layout() 

    def __set_properties(self): 
     self.SetTitle("Picture") 

    def __do_layout(self): 
     panel1 = Panel1(self) 
     self.sizer = wx.BoxSizer(wx.VERTICAL) 
     self.sizer.Add(panel1, 1, wx.EXPAND) 
     self.SetSizer(self.sizer) 
     self.sizer.Fit(self) 
     self.Layout() 
     self.Centre() 

# end of class Frame1 

class Game1(wx.App): 
    def OnInit(self): 
     wx.InitAllImageHandlers() 
     frame1 = Frame1(None, wx.ID_ANY, "") 
     self.SetTopWindow(frame1) 
     frame1.Show() 
     return 1 

# end of class Game1 

if __name__ == "__main__": 
    game1 = Game1(0) 
    game1.MainLoop() 
+2

你沒有提到代碼有什麼問題。有什麼問題嗎? – 2014-10-29 16:12:49

回答

0

要使圖像的大小最大化,您需要趕上wx.EVT_MAXIMIZE。然後在你的事件處理程序中,你需要調用你的函數來更新你創建的圖像控件。您可能需要使用相框的尺寸來幫助您確定您的MaxImageSize應該是什麼。

對於加載按鈕問題,您可能需要調用sizer或小部件的父項的方法Layout()