wxpython在重新调整大小时重新排列位图

时间:2014-04-04 11:01:04

标签: python python-2.7 wxpython

我有这个wxpython代码,我在其中显示图像和文本。我正在使用flexgridsizer进行布局管理。我希望当我调整窗口大小时,图像应该按照大小重新排列,就像有更多的空间而不是列和行应该扩展一样,我也会在重新生成图像时看到闪烁。

如果还有其他更好的方法,请建议

import wx

ID_MENU_REFRESH = wx.NewId()
#dummy description of image
imglist =['One','Two','Three','Four','Five','Six','Seven','Eight','Nine','Ten']

class Example(wx.Frame):

    def __init__(self, *args, **kwargs):
        super(Example, self).__init__(*args, **kwargs) 
        mb = wx.MenuBar()
        fMenu = wx.Menu()
        fMenu.Append(ID_MENU_REFRESH, 'Refresh')
        mb.Append(fMenu, '&Action')
        self.SetMenuBar(mb)
        self.Bind(wx.EVT_MENU, self.refreshApps, id=ID_MENU_REFRESH) 

        #storing the thumb image in memory
        self.bmp=wx.Image('img/myimg.png', wx.BITMAP_TYPE_PNG).ConvertToBitmap()
        self.panelOne = wx.Panel(self)        
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        self.panelOne.SetSizer(sizer)
        self.panelOne.Layout()
        self.myimg_holder={}
        self.showThumb(imglist)
        self.SetTitle('Example')
        self.Centre()
        self.Show(True)

    def refreshApps(self,event=None):
        #remove 
        self.showThumb()
        #repaint
        self.showThumb(imglist)

    def showThumb(self,thumblist=None):


        if not thumblist:
            for child in self.panelOne.GetChildren(): 
                child.Destroy() 
            self.myimg_holder.clear()
            self.panelOne.Layout()
            return 

        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox = wx.BoxSizer()
        gs = wx.FlexGridSizer(8, 6, 10, 20)
        #blank text holder for padding
        gs.Add(wx.StaticText(self.panelOne),flag=wx.ALL|wx.EXPAND, border=2)
        vzis = []
        for num,app in enumerate(thumblist):
            vzis.append(wx.BoxSizer(wx.VERTICAL))
            appid = wx.StaticBitmap(self.panelOne,wx.ID_ANY, self.bmp, (5,5), (self.bmp.GetWidth()+5, self.bmp.GetHeight()),name=app.strip())
            vzis[num].Add(appid,0, wx.ALIGN_CENTER)
            self.myimg_holder[appid]=app
            vzis[num].Add(wx.StaticText(self.panelOne,-1,app),0, wx.ALIGN_CENTER,border=1)
        for i in range(len(thumblist)):
            if i in [4,8,12]:
                gs.Add(wx.StaticText(self.panelOne),flag=wx.ALL, border=2)
                gs.Add(wx.StaticText(self.panelOne),flag=wx.ALL, border=2)
                gs.Add(vzis[i],flag=wx.ALL, border=1)
            else:
                gs.Add(vzis[i],flag=wx.ALL, border=1)
        vbox.Add(wx.StaticText(self.panelOne),flag=wx.ALL, border=4)
        vbox.Add(gs, proportion=1, flag=wx.ALL)
        vbox.Add(wx.StaticText(self.panelOne),flag=wx.ALL, border=4)
        self.panelOne.SetSizer(vbox)
        self.panelOne.Layout()

def main():

    ex = wx.App()
    frame = Example(None)
    frame.Show()
    ex.MainLoop()    


if __name__ == '__main__':
    main()

1 个答案:

答案 0 :(得分:0)

如果您希望图像重新排列,那么您不想使用FlexGridSizer。你想要的是WrapSizer:

如果您希望在调整框架大小时自己调整位图大小,那么您必须自己完成。大小调整器不会自动执行此操作。它们会调整正常小部件的大小,但不会调整大小。您可能需要捕获EVT_SIZE并根据需要调整位图大小。如果您想要沿着该路线行进。

为了减少闪烁,你可能想看看Freeze和Thaw方法。