重新缩放整个面板以适合窗口大小

巴吉

MyPanel的大小(1200,800)已嵌入到父项中MainPanel(其大小可以随的大小而变化MainFrame):

import wx

class MyPanel(wx.Panel):   # panel embedded in the main panel
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1, size=(1200,800))
        sizer = wx.BoxSizer(wx.VERTICAL)
        bmp = wx.BitmapFromImage(wx.Image('background.png', wx.BITMAP_TYPE_PNG))  
        myimg = wx.StaticBitmap(self, -1, bmp)
        sizer.Add(myimg, 0, wx.SHAPED, 10)

class MainPanel(wx.Panel):   # main panel embedded in the main frame
    def __init__(self, parent):
        wx.Panel.__init__(self, parent, -1)
        self.mypanel = MyPanel(self)

class MainFrame(wx.Frame):  # main frame window
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, -1, title, size=(800,600))
        self.panel = MainPanel(self)
        self.Show()

app = wx.App(0)
frame = MainFrame(None, 'Test')
app.MainLoop()

如何自动缩放 MyPanel 以使其适合父级 MainPanel ,并保持其长宽比?

备注:我正在寻找与Windows标准照片查看器接近的行为:调整窗口大小时,图像将重新缩放以适合父窗口。

在此处输入图片说明

编码员

只需将我以前的答案应用于要保持宽高比的面板即可。尚不清楚您想要的确切行为的100%,但这应该可以使您足够接近。

import wx

    class MyPanel(wx.Panel):   # panel embedded in the main panel
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1)
            sizer = wx.BoxSizer(wx.VERTICAL)
            txt = wx.StaticText(self, label="Missing Bitmap");
            sizer.Add(txt, 0, wx.SHAPED, 10)

            self.SetInitialSize((1200, 800))
            self.BackgroundColour = wx.RED
            self.Sizer = sizer

            self.Bind(wx.EVT_SIZE, self.OnSize)

        def OnSize(self, evt):
            hsize = evt.Size[0] * 0.75 # Constrain max height to 75% of width
            self.SetSizeHints(-1, hsize, maxH=hsize)
            evt.Skip()

重要的是在这里,您需要在每次要求更改子面板窗口大小时调整子面板窗口上的大小提示,以告诉尺寸调整器限制对窗口几何形状的约束。

    class MainPanel(wx.Panel):   # main panel embedded in the main frame
        def __init__(self, parent):
            wx.Panel.__init__(self, parent, -1)
            self.mypanel = MyPanel(self)

            self.BackgroundColour = wx.BLACK

设置背景色以帮助显示父面板与其子面板(红色)之间的差异。

            vsizer = wx.BoxSizer(wx.VERTICAL)
            vsizer.AddStretchSpacer(0)
            vsizer.Add(self.mypanel, 1, wx.SHAPED|wx.EXPAND|wx.ALIGN_CENTER)
            vsizer.AddStretchSpacer(0)

            hsizer = wx.BoxSizer(wx.HORIZONTAL)
            hsizer.AddStretchSpacer(0)
            hsizer.Add(vsizer, 1, wx.EXPAND|wx.ALIGN_CENTER)
            hsizer.AddStretchSpacer(0)

            self.Sizer = hsizer;

在MainPanel中,它使用两个带有拉伸间隔器的调整器,以在调整窗口大小时将子面板水平和垂直地推向中间。

    class MainFrame(wx.Frame):  # main frame window
        def __init__(self, parent, title):
            wx.Frame.__init__(self, parent, -1, title, size=(800,600))
            self.panel = MainPanel(self)
            self.Show()

    app = wx.App(0)
    frame = MainFrame(None, 'Test')
    app.MainLoop()

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章