2014-10-29 47 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()