wxwidgets / wxPython:在保持宽高比的同时调整wxFrame的大小

时间:2009-08-18 05:37:21

标签: wxpython resize wxwidgets frame aspect-ratio

我有一个只有一个孩子的wx.Frame。在设置子项的wx.Sizer时,我可以使用wx.SHAPED标志,该标志可以保持子项的宽高比。但是,框架在宽高比方面仍然具有完全的自由度,并且会在孩子未使用的区域留下空白区域。

如何在调整大小期间锁定wx.Frame的宽高比?

2 个答案:

答案 0 :(得分:5)

Sizer不能应用于顶级窗口(为了定义窗口本身的属性而不是它们的内容),所以很遗憾没有“真正”的方法来锁定宽高比。您最好的选择是捕获窗口的OnSize事件,获取用户想要窗口的大小(存储在wxSizeEvent中),根据方面计算新的宽度和高度比率,然后立即使用新尺寸调用SetSize

此技术在调整大小时存在视觉瑕疵的缺点(操作系统最初将根据用户拖动窗口的方式绘制窗口,但在调用SetSize后立即重新绘制窗口,从而导致闪烁效果)所以它不是一个很好的解决方案,但是因为你无法将顶级窗口锁定为宽高比(并且根本不需要调整SetSize),你必须决定闪烁是否值得。

答案 1 :(得分:3)

以下是一些示例代码。有一点闪烁,我不确定消除它的好方法。

import wx

class Frame(wx.Frame):
    def __init__(self):
        super(Frame, self).__init__(None, -1, 'Shaped Frame')
        self.Bind(wx.EVT_SIZE, self.on_size)
        self.panel = panel = wx.Panel(self, -1)
        sizer = wx.BoxSizer(wx.VERTICAL)
        sizer.Add(panel, 1, wx.SHAPED)
        self.SetSizer(sizer)
    def on_size(self, event):
        event.Skip()
        self.Layout()
        self.panel.SetMinSize(self.panel.GetSize())
        self.Fit()

if __name__ == '__main__':
    app = wx.PySimpleApp()
    frame = Frame()
    frame.Show()
    app.MainLoop()