2

子が 1 つしかない wx.Frame があります。子の wx.Sizer を設定するときに、wx.SHAPED フラグを使用して、子の縦横比をロックします。ただし、フレームの縦横比は完全に自由であり、子供が使用しない領域には空白が残ります。

サイズ変更中に wx.Frame のアスペクト比をロックするにはどうすればよいですか?

4

2 に答える 2

5

(ウィンドウの内容ではなく、ウィンドウ自体のプロパティを定義するために)サイザーをトップレベル ウィンドウに適用することはできないため、残念ながら、アスペクト比をロックする「真の」方法はありません。あなたの最善の策は、ウィンドウのOnSizeイベントをキャッチし、ユーザーがウィンドウを希望するサイズ ( に格納されているwxSizeEvent) を取得し、アスペクト比に従って新しい幅と高さを計算し、すぐSetSizeに新しいサイズで呼び出すことです。

この手法には、サイズ変更中に視覚的なアーティファクトが発生するという欠点があります (オペレーティング システムは、ユーザーがウィンドウをドラッグした方法に応じてウィンドウを最初に描画しますが、 を呼び出すとすぐに再描画SetSizeし、ちらつき効果につながります)、優れた解決策ではありません。 、ただし、トップレベルのウィンドウを縦横比に固定することはできません (そして、サイズ変更の必要性をSetSizeまったく防ぐことはできません) ので、ちらつきが価値があるかどうかを判断する必要があります。

于 2009-08-18T06:11:33.503 に答える
3

ここにいくつかのサンプルコードがあります。ちらつきが少しありますが、それを取り除く良い方法がわかりません。

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()
于 2009-08-18T12:59:22.503 に答える