2009-08-18 42 views
2

wx.Frameに子が1つしかありません。子供のwx.Sizerを設定している間は、子のアスペクト比をロックしたままにするwx.SHAPEDフラグを使うことができます。ただし、フレームのアスペクト比は完全に自由であり、その領域に空き領域が残されます。wxwidgets/wxPython:縦横比を維持しながらwxFrameのサイズを変更する

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

答えて

5

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

このテクニックでは、サイズ変更時の視覚的なアーチファクトの欠点があります(オペレーティングシステムは最初にユーザーがドラッグした方法に従ってウィンドウをペイントしますが、SetSizeを呼び出すとすぐに描画してちらつき効果をもたらします)ただし、トップレベルのウィンドウをアスペクト比にロックすることはできず(SetSizeでサイズを変更する必要がないため)、ちらつきがそれに見合うかどうかを判断する必要があります。

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() 
+1

私の推測では、ちらつきをなくすことは不可能です。 OnSizeイベントは、サイズ変更が開始された後に常に発生します。つまり、イベントが受信されたときにSetSizeを呼び出すと常にちらつきが発生します(これはwx固有の問題ではなくOSの制限です)。さらに、ウインドウフレーム(の描画と機能)はOSによって完全に制御されるため、機能を変更しようとするための「オーバーライド」はできません。 – GRB

関連する問題