wxpython:如何获取面板的大小或使图像适合面板的大小

问题描述 投票:2回答:1

我想将图像放入wxPanel的中心,我正在考虑需要调整图像的大小以适合wxPanel。但是我无法动态获取wxPanel的大小。这是一个测试代码。

#!/usr/bin/python

# wxboxsizer.py

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(500, 500))
        panel1 = wx.Panel(self, -1,style= wx.SIMPLE_BORDER)
        panel2 = wx.Panel(self, -1,style= wx.SIMPLE_BORDER)
        panel3 = wx.Panel(self, -1,style= wx.SIMPLE_BORDER)
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(panel1, 1,flag = wx.EXPAND|wx.ALL,border = 3 )
        box.Add(panel2, 1,flag = wx.EXPAND|wx.ALL,border = 3 )
        box.Add(panel3, 1,flag = wx.EXPAND |wx.ALL,border = 3)
        self.SetSizer(box)


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wxboxsizer.py')
        frame.Show(True)
        return True

app = MyApp(0)
app.MainLoop()

此代码可以使3个面板完美地适合框架,但是如何动态获取面板的尺寸。此外,如何将图像放入面板中,并使图像动态地适合面板?

我的解决方案:我只是有一种方法,可以在调整框架大小时获取面板的大小。

#!/usr/bin/python

# wxboxsizer.py

import wx,os

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(500, 500))
        self.panel1 = wx.Panel(self, -1,style= wx.SIMPLE_BORDER)
        panel2 = wx.Panel(self, -1,style= wx.SIMPLE_BORDER)
        panel3 = wx.Panel(self, -1,style= wx.SIMPLE_BORDER)
        box = wx.BoxSizer(wx.VERTICAL)
        box.Add(self.panel1, 1,flag = wx.EXPAND|wx.ALL,border = 3 )
        box.Add(panel2, 1,flag = wx.EXPAND|wx.ALL,border = 3 )
        box.Add(panel3, 1,flag = wx.EXPAND |wx.ALL,border = 3)
        self.Bind(wx.EVT_SIZE, self.OnSize)
        self.SetSizer(box)

    def OnSize(self, event):
        size = self.GetSize()
        size2 = self.panel1.GetSize()
        print size,size2
        event.Skip()


class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'wxboxsizer.py')
        frame.Show(True)
        return True

app = MyApp(0)
app.MainLoop()

此代码可以在调整框架大小时显示面板的大小。

python wxpython
1个回答
1
投票

Show()之后的面板尺寸可用这是获取面板尺寸并将同一图像适合不同尺寸面板的示例。 3个面板显示相同的图像。如果要在垂直尺寸调整器中显示图像,则必须修改Aspect计算。

import wx

class MyFrame(wx.Frame):
    def __init__(self, parent, id, title):
        wx.Frame.__init__(self, parent, id, title, (-1, -1), wx.Size(500, 500))
        self.MaxImageSize = 500
        self.panel1 = wx.Panel(self)
        self.panel2 = wx.Panel(self)
        self.panel3 = wx.Panel(self)
        self.Image1 = wx.StaticBitmap(self.panel1, bitmap=wx.EmptyBitmap(self.MaxImageSize, self.MaxImageSize))
        self.Image2 = wx.StaticBitmap(self.panel2, bitmap=wx.EmptyBitmap(self.MaxImageSize, self.MaxImageSize))
        self.Image3 = wx.StaticBitmap(self.panel3, bitmap=wx.EmptyBitmap(self.MaxImageSize, self.MaxImageSize))

        box = wx.BoxSizer(wx.HORIZONTAL)
        box.Add(self.panel1, 1,flag = wx.EXPAND|wx.ALL,border = 3)
        box.Add(self.panel2, 2,flag = wx.EXPAND|wx.ALL,border = 3)
        box.Add(self.panel3, 3,flag = wx.EXPAND|wx.ALL,border = 3)
        self.SetSizer(box)
        Img1 = wx.Image('./image2.png', wx.BITMAP_TYPE_PNG)
        Img2 = wx.Image('./image2.png', wx.BITMAP_TYPE_PNG)
        Img3 = wx.Image('./image2.png', wx.BITMAP_TYPE_PNG)
        self.Show()
        W,H = self.panel1.GetSize()
        IW = Img1.GetWidth()
        IH = Img1.GetHeight()
        NewW = W
        if IH>IW:
            Aspect = float(IW) /float(IH)
        else:
            Aspect = float(IH) / float(IW)
        NewH = W * Aspect

# scale the image, keeping ratio
        Img1 = Img1.Scale(NewW,NewH)
        self.Image1.SetBitmap(wx.BitmapFromImage(Img1))

        W,H = self.panel2.GetSize()
        NewW = W
        NewH = W * Aspect
# scale the image, keeping ratio
        Img2 = Img2.Scale(NewW,NewH)
        self.Image2.SetBitmap(wx.BitmapFromImage(Img2))

        W,H = self.panel3.GetSize()
        NewW = W
        NewH = W * Aspect
# scale the image, keeping ratio
        Img3 = Img3.Scale(NewW,NewH)
        self.Image3.SetBitmap(wx.BitmapFromImage(Img3))
        self.Fit()
        self.Layout()

class MyApp(wx.App):
    def OnInit(self):
        frame = MyFrame(None, -1, 'Fit images')
        frame.Show(True)
        return True

app = MyApp(0)
app.MainLoop()
© www.soinside.com 2019 - 2024. All rights reserved.