【发布时间】:2018-06-23 23:51:56
【问题描述】:
目标
StaticBitmap可以通过主框架的方法更新,并且有滚动条。
详情
我想在 sizer 的第一个单元格中添加一个图像 (StaticBitmap)。问题是图像被裁剪并且没有滚动条。
图像无法缩放以适合单元格。这不是我的程序所需要的。
上传的代码显示了我最后一次尝试使其工作。我试图将StaticBitmap 包裹在ScrolledPanel 中。这一直有效,直到我更新位图(函数 update_crnt_bm )然后调整框架大小。
代码
from PIL import Image
import wx
import wx.lib.scrolledpanel as scrl
class Button(wx.Button):
def __init__(self, parent, label, action=None):
super().__init__(parent, label=label)
self.Bind(wx.EVT_BUTTON, action)
class ImgPanel(scrl.ScrolledPanel):
'''Scrolled Panel with Image'''
def __init__(self, parent, bitmap):
super().__init__(parent)
self.img_sizer = wx.BoxSizer(wx.VERTICAL)
self.sbm = wx.StaticBitmap(self, bitmap=bitmap)
self.img_sizer.Add(self.sbm, 1, wx.EXPAND)
self.SetSizer(self.img_sizer)
self.SetupScrolling()
self.Bind(wx.EVT_SIZE, self.on_resize)
def load_bm(self, bitmap):
self.sbm.Destroy()
self.sbm = wx.StaticBitmap(self, bitmap=bitmap)
def on_resize(self, event):
super().Layout()
class MainFrame(wx.Frame):
def __init__(self, fns):
super().__init__(None, title='Test multiple images')
self.resized = False
if len(fns) < 1:
print('Please select at lease one image')
exit(1)
self.fns = fns
self.init_panel()
self.Show()
def side_bar(self):
sizer = wx.GridBagSizer()
for i, fn in enumerate(self.fns):
bttn = Button(self.panel, 'Image #'+str(i), self.getupd_crnt_bm(fn))
sizer.Add(bttn, pos=(i,0))
return sizer
def init_panel(self):
self.panel = wx.Panel(self)
self.sizer = wx.GridBagSizer()
self.sizer.Add(self.side_bar(), pos=(0,1))
self.img_panel = ImgPanel(self.panel, self.open_bm(self.fns[0]))
self.sizer.Add(self.img_panel, pos=(0,0), flag=wx.EXPAND)
self.sizer.AddGrowableCol(0)
self.sizer.AddGrowableRow(0)
self.panel.SetSizerAndFit(self.sizer)
def getupd_crnt_bm(self, fn):
def update_crnt_bm(event):
bm = self.img_to_bm(Image.open(fn))
self.img_panel.load_bm(bm)
self.current_bm = bm
return update_crnt_bm
def open_bm(self, fn):
return self.img_to_bm(Image.open(fn))
def img_to_bm(self, image):
scale = 0.3
image = image.resize((int(image.size[0]*scale), int(image.size[1]*scale)))
width, height = image.size
bm = wx.Bitmap.FromBuffer(width, height, image.tobytes())
return bm
if __name__ == '__main__':
fns = ['image0.jpg', 'image1.jpg', 'image2.jpg']
app = wx.App()
frame = MainFrame(fns)
app.MainLoop()
版本
- Python 3.6.5
- wx 4.0.1 msw(凤凰)
- PIL 1.1.7
【问题讨论】:
标签: python-3.x user-interface wxpython