我有一个只有一个孩子的 wx.Frame。在设置孩子的 wx.Sizer 时,我可以使用 wx.SHAPED 标志,它保持孩子的纵横比锁定。但是,Frame 在其纵横比方面仍然具有完全的自由度,并且会在孩子未使用的区域中留下空白区域。
如何在调整大小期间锁定 wx.Frame 的纵横比?
我有一个只有一个孩子的 wx.Frame。在设置孩子的 wx.Sizer 时,我可以使用 wx.SHAPED 标志,它保持孩子的纵横比锁定。但是,Frame 在其纵横比方面仍然具有完全的自由度,并且会在孩子未使用的区域中留下空白区域。
如何在调整大小期间锁定 wx.Frame 的纵横比?
Sizer 不能应用于顶级窗口(为了定义窗口本身的属性而不是它们的内容),所以不幸的是没有“真正的”方法来锁定纵横比。最好的办法是捕捉窗口的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()