【问题标题】:wxPython: Updatable Static Bitmap that has scrollswxPython:具有滚动的可更新静态位图
【发布时间】: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


    【解决方案1】:

    回答我自己的问题

    还是把它留在这里,以便其他人可以找到此代码。

    解决方案

    事实证明,重新创建的 StaticBitmap 必须再次添加到 sizer。这是load_bm 现在的功能。 (不敢相信它这么明显)

    def load_bm(self, bitmap):
        self.sbm.Destroy()
        self.Scroll(0,0)
        self.sbm = wx.StaticBitmap(self, bitmap=bitmap)
        self.img_sizer.Add(self.sbm, 1, wx.EXPAND)
    

    此外,滚动状态设置为 0。这会强制将图像添加到 ScrolledPanel 的左上角。

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-20
      • 2011-03-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多