コンテンツが垂直方向の境界を超えた場合に垂直スクロールバーを自動的に挿入するパネル サブクラスを実装しようとしています。パネルがあらゆる点で通常のパネルとまったく同じように機能するようにしたいのですが、1 つの点を除いて: パネルの最小の高さがサイザーの最小の高さである代わりに、静的な値 (200 など) を持つ必要があります。パネルがサイザーの高さよりも低い場合、垂直スクロールバーが表示されます。つまり、パネルの高さがサイザーの最小高さよりも高い場合、通常のパネルとまったく同じように機能する必要があります。
私が抱えている問題は、パネル上のDoGetBestSize
やのような関数をオーバーライドしても効果がないことです。これらの関数は呼び出されないためです (ブレークポイントを挿入して確認しました)。GetMinSize
パネルの親はパネルのサイザーと直接通信していると思います。この場合、パネルの外側から設定された通常のボックスサイザーです。
class ScrolledPanel(wx.Panel):
"""A panel that will automatically add scrollbars when needed."""
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.SetBackgroundColour('#FF0000')
# This function is never called.
def DoGetBestSize(self):
"""Override the minimum size of the panel."""
default = self.GetSizer().GetMinSize()
default.SetHeight(250)
return default
私が求めている効果を達成することは可能ですか?もしそうなら、どうすれば上記の問題を回避できますか?
これは、スクロールされたパネルを使用しようとしているコードです。
アップデート
私はSetSizer
関数をオーバーライドしようと考え、サイザーの人質を取り、サイズについて相談しましたが、実際にはパネルにサイザーを設定しませんでした。そうすれば、次のようなカスタム サイズ関数DoGetBestSize
が呼び出されます。しかし、それは失敗しました。sizer が設定されていない場合でも、これらの関数が呼び出されることはありません。Panel
と の両方を試しましたPyPanel
。ここに私の現在のスクロールパネルがあります:
class ScrolledPanel(wx.PyPanel):
"""A panel that will automatically add scrollbars when needed."""
def __init__(self, parent):
wx.Panel.__init__(self, parent, -1)
self.SetBackgroundColour('#FF0000')
# This function is called.
def SetSizer(self, sizer):
import pdb; pdb.set_trace()
self._pet_sizer = sizer
# The below functions are never called.
def DoGetBestSize(self):
"""Override the minimum size of the panel."""
import pdb; pdb.set_trace()
default = self.GetSizer().GetMinSize()
default.SetHeight(250)
return default
def DoGetClientSize(self):
import pdb; pdb.set_trace()
def DoGetSize(self):
import pdb; pdb.set_trace()
def DoGetVirtualSize(self):
import pdb; pdb.set_trace()