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

wxwidgets/wxPython:在保持纵横比的同时调整wxFrame的大小,wxpython,resize,wxwidgets,frame,aspect-ratio,Wxpython,Resize,Wxwidgets,Frame,Aspect Ratio,我有一个只有一个孩子的wx.Frame。在设置子对象的wx.Sizer时,我可以使用wx.SHAPED标志,它保持子对象的纵横比处于锁定状态。但是,框架在其纵横比方面仍然具有完全的自由度,并且将在子对象未使用的区域中留下空白 如何在调整大小期间锁定wx.Frame的纵横比?大小调整器无法应用于顶级窗口(以便定义窗口本身的属性而不是其内容),因此不幸的是,没有“真正”的方法锁定纵横比。您最好的方法是捕获窗口的OnSize事件,获取用户希望窗口的大小(存储在wxSizeEvent中),根据纵横比计算

我有一个只有一个孩子的wx.Frame。在设置子对象的wx.Sizer时,我可以使用wx.SHAPED标志,它保持子对象的纵横比处于锁定状态。但是,框架在其纵横比方面仍然具有完全的自由度,并且将在子对象未使用的区域中留下空白


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

大小调整器无法应用于顶级窗口(以便定义窗口本身的属性而不是其内容),因此不幸的是,没有“真正”的方法锁定纵横比。您最好的方法是捕获窗口的
OnSize
事件,获取用户希望窗口的大小(存储在
wxSizeEvent
中),根据纵横比计算新的宽度和高度,然后立即使用新的大小调用
SetSize


这种技术的缺点是在调整大小时会出现视觉伪影(操作系统最初会根据用户拖动窗口的方式绘制窗口,但在调用
SetSize
后会立即重新绘制窗口,导致闪烁效果),因此这不是一个很好的解决方案,但是,由于您无法将顶级窗口锁定为纵横比(并且根本不需要使用
SetSize
调整大小),因此您必须确定闪烁是否值得。

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

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()

我的猜测是不可能消除闪烁。OnSize事件总是在开始调整大小后触发,这意味着在之后接收到事件时调用SetSize将始终导致闪烁(这是操作系统限制,不是wx特定的问题)。此外,窗口框架(的绘图和功能)完全由操作系统控制,因此无法“覆盖”它以尝试更改其功能。您可以使用冻结()和解冻()稍微减少闪烁。称他们为自我尺寸的第一名和最后一名。