【问题标题】:wxpython:How can I get the size of a panel or let a image fit the size of panelwxpython:如何获得面板的大小或让图像适合面板的大小
【发布时间】:2016-01-22 08:25:00
【问题描述】:

我想将图像放入 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()

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

【问题讨论】:

  • 如果面板没有调整大小,您可以在 OnSize 方法中调用 self.Layout() 和/或 self.Fit()。对于图像,您可以使用 wx.Image 来保存您的图像对象并将其放入 wx.StaticBitmap 并将其放置在面板上。

标签: python wxpython


【解决方案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()

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-01-22
    • 2021-11-10
    • 2013-10-18
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多