我有一個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