1

奇妙な動作をする wxpython コードがいくつかあります。これは OKAY コードです:

class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent, title=title,size=(500, 300))
        self.CreateStatusBar() 
        panel = wx.Panel(self)

        self.srcSizer = wx.BoxSizer(wx.HORIZONTAL)
        srcButton = wx.Button(panel, wx.ID_ANY, "src")
        srcButton.Bind(wx.EVT_BUTTON, self.onSrcButton)
        self.srcSizer.Add(srcButton, 0)
        self.srcTxt = wx.TextCtrl(panel, wx.ID_ANY)
        self.srcSizer.Add(self.srcTxt, 1, flag=wx.EXPAND | wx.LEFT | wx.RIGHT, border=10)

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.srcSizer, 0 , flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.TOP, border=10)


        panel.SetSizer(self.sizer)
        self.Show(True)

ステータスバーとパネルを作成する2行を入れ替えると、

panel = wx.Panel(self)
self.CreateStatusBar() 

次に、ウィンドウがロードされるとボタンと textctrl が重なり、手動でウィンドウのサイズを変更すると、それらは通常の位置に戻されます!!

self.CreateStatusBar() は、パネルなどを作成する前に常にある必要がありますか?

ありがとう

4

1 に答える 1

3

CreateStatusBar()フレームのサイズ変更イベントをトリガーして、ステータス バーのスペースを確保します。パネルが既に作成されている場合は、フレームのクライアント領域に合わせてサイズ変更されます。パネルのサイズを変更すると、パネルのサイズ変更イベントがトリガーされ、該当する場合はレイアウト (サイザー) が再計算されます。

(パネルのサイザーに追加される) コントロールを作成すると、デフォルトの位置 (0,0) にデフォルトのサイズで配置されます。それらを正しい位置に移動するには、レイアウト (サイザー) の更新が必要になります。(これが、問題が発生したときに左上隅にコントロールの山がある理由です。)

フレームが表示されると、サイズ変更イベントが (再び) 発生します。ただし、パネルが既にフレームのクライアント領域に収まっている場合、パネルのサイズ変更イベントはトリガーされないため、レイアウトは更新されません。

ステータスバーがなくても、クライアント領域のサイズでパネルを作成することで、その効果を観察できます。

panel = wx.Panel(self,size=self.GetClientSize())
#self.CreateStatusBar()

同様に、パネルのサイズを別の値に設定することで、更新をトリガーできます (フレームが表示されると、パネルのサイズが再び変更されます)。

# at the end of __init__
panel.SetSize(0,0)

ただし、これは不要なサイズ変更を作成します。最初は手動でSetSize()、次にframe.Show(). より良い方法があります (以下を参照)。

ではwx 2.8、この問題は にも当てはまりCreateToolBar()ます。wx 2.9.4ツールバーを正しく処理するように見えます。


回避策として、次のことができます。

  • パネルを作成する前、またはパネルのサイザーを設定した にツールバー/ステータスバーを作成します (最初にコントロールをサイザーに追加する必要があります)。
  • サイザーを設定した後、パネルのレイアウトを再計算します。

    panel.SetSizer(sizer)
    panel.Layout()
    
于 2012-12-23T18:24:27.637 に答える