【问题标题】:wxpython rearrange bitmap on resizewxpython在调整大小时重新排列位图
【发布时间】:2014-04-04 11:01:04
【问题描述】:

我有这个 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()

【问题讨论】:

    标签: python python-2.7 wxpython


    【解决方案1】:

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

    如果您希望在调整框架大小时调整位图本身的大小,那么您必须自己执行此操作。 sizer 不会自动执行此操作。他们确实会调整普通小部件的大小,但不会调整图像。如果您想走这条路,您可能需要捕获 EVT_SIZE 并适当调整位图的大小。

    为了减少闪烁,您可能需要了解一下 Freeze 和 Thaw 方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-02
      • 2014-09-15
      • 2016-07-08
      相关资源
      最近更新 更多