我有一个wx.Frame只有一个孩子。在设置孩子的wx.Sizer时,我可以使用wx.SHAPED标志,该标志保持孩子的长宽比。但是,Frame的高宽比仍然具有完全的自由度,并且会在未被儿童使用的区域留下空白区域。wxwidgets/wxPython:在保持长宽比的同时调整wxFrame的大小
如何在调整大小期间锁定wx.Frame的宽高比?
我有一个wx.Frame只有一个孩子。在设置孩子的wx.Sizer时,我可以使用wx.SHAPED标志,该标志保持孩子的长宽比。但是,Frame的高宽比仍然具有完全的自由度,并且会在未被儿童使用的区域留下空白区域。wxwidgets/wxPython:在保持长宽比的同时调整wxFrame的大小
如何在调整大小期间锁定wx.Frame的宽高比?
Sizers不能应用到顶级窗口(为了定义窗口本身的属性而不是它们的内容),所以不幸的是没有“真实”的方式来锁定宽高比。你最好的办法是赶上你的窗口的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事件总是在调整大小后开始,这意味着当事件接收后总会导致闪烁(这是一个操作系统限制,而不是wx特定的问题)时调用SetSize。此外,窗口框架(的绘图和功能)完全由操作系统控制,因此无法“覆盖”它来尝试和改变其功能。 – GRB 2009-08-18 14:09:12