我有这个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()
答案 0 :(得分:0)
如果您希望图像重新排列,那么您不想使用FlexGridSizer。你想要的是WrapSizer:
如果您希望在调整框架大小时自己调整位图大小,那么您必须自己完成。大小调整器不会自动执行此操作。它们会调整正常小部件的大小,但不会调整大小。您可能需要捕获EVT_SIZE并根据需要调整位图大小。如果您想要沿着该路线行进。
为了减少闪烁,你可能想看看Freeze和Thaw方法。