子が 1 つしかない wx.Frame があります。子の wx.Sizer を設定するときに、wx.SHAPED フラグを使用して、子の縦横比をロックします。ただし、フレームの縦横比は完全に自由であり、子供が使用しない領域には空白が残ります。
サイズ変更中に wx.Frame のアスペクト比をロックするにはどうすればよいですか?
子が 1 つしかない 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()