3

私は wxPython で UI を構築しています[注 1]。3 つの本体パネル、2 つのツールバー、および 2 つのBoxSizer要素 (上記のすべてを含む垂直のものと本体パネルを含む水平のもの) を持つステータス バーがあります。 )。レイアウトを正しく動作させることができず、ドキュメントに記載されていない動作が発生しています。一部の詳細は省略していますが、アプリの関連する (機能する) 部分は次のとおりです。

import wx
import wx.adv

class MyApp(wx.App):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)

    def OnInit(self):
        self.frame = AppFrame(parent=None, title="My Sweet App")
        self.SetTopWindow(self.frame)
        self.frame.Show()
        return True

class AppFrame(wx.Frame):
    def __init__(self, size=(1024, 768), *args, **kwargs):
        super().__init__(size=size, *args, **kwargs)

        # Menu (quit only)
        menubar = wx.MenuBar()
        file_menu = wx.Menu()

        quit_item = wx.MenuItem(
            file_menu, wx.ID_EXIT, '&Exit', 'Close the application')
        file_menu.Append(quit_item)
        self.Bind(wx.EVT_MENU, OnQuit, id=wx.ID_EXIT)
        menubar.Append(file_menu, '&File')
        self.SetMenuBar(menubar)

        # Outer box wrapper
        main_box = wx.BoxSizer(orient=wx.VERTICAL)
        self.SetSizer(main_box)
        main_box.SetMinSize(size)

        # Inner box with the three main view panels in it
        wrap_panels_box = wx.BoxSizer(orient=wx.HORIZONTAL)
        wrap_panels_box.SetMinSize(200, 200)
        panel1 = wx.Panel(self, -1)
        panel2 = wx.Panel(self, -1)
        panel3 = wx.Panel(self, -1)
        common_flags = wx.SizerFlags().Expand().Border(wx.ALL, 5)
        wrap_panels_box.AddMany([(panel1, common_flags),
                                 (panel2, common_flags),
                                 (panel3, common_flags)])

        # Two toolbars for different sets of commands
        toolbar1 = wx.ToolBar(parent=self)
        tool1 = toolbar1.CreateTool(
            toolId=wx.ID_NEW, label='',
            bmpNormal=wx.ArtProvider.GetBitmap(wx.ART_NEW, wx.ART_TOOLBAR))
        toolbar1.AddTool(tool1)
        toolbar1.Realize()

        toolbar2 = wx.ToolBar(parent=self)
        tool2 = toolbar2.CreateTool(
            toolId=wx.ID_SAVE, label='',
            bmpNormal=wx.ArtProvider.GetBitmap(wx.ART_FILE_SAVE, wx.ART_TOOLBAR))
        toolbar2.AddTool(tool2)
        toolbar2.Realize()

        statusbar = wx.StatusBar(parent=self)

        # Add all layout elements
        bar_flags = common_flags.Proportion(0)

        main_box.Add(toolbar1, bar_flags)
        main_box.Add(wrap_panels_box, common_flags.Proportion(1))
        main_box.Add(toolbar2, bar_flags)
        main_box.Add(statusbar, bar_flags)

        self.Layout()

def OnQuit(event):
    exit(0)

if __name__ == '__main__':
    app = MyApp()
    app.MainLoop()

すべてのサブコンポーネント生成メソッド ( _GenerateMenu()_GenerateToolStatusBars()、および_GenerateViewPanels()) は期待どおりに動作し、基本的に希望どおりに動作するため、それらは脇に置いておきます。

さまざまな部分はおおむね適切な場所にありますが、ここにはいくつかの癖があります。

1.ステータスバーの拡張

_GenerateToolStatusBars()メソッドによって返されるステータス バーは、Proportion(1)設定されているように動作します。メイン ウィンドウが垂直方向に拡大されると、垂直方向に拡大または縮小します。また、その上に追加のスペースがあります。ただし、パネルの比率を次のように設定することで、これを停止できます。

bar_flags = common_flags.Proportion(-1)

main_box.Add(toolbar1, bar_flags)
main_box.Add(wrap_panels_box, common_flags.Proportion(0))
main_box.Add(toolbar2, bar_flags)
main_box.Add(statusbar, bar_flags)

の[注 2]設定の-1値は文書化されておらず、動作は基本的に元のコード サンプルから期待されるものと一致します。何が起きてる?Proportion()Sizer

2.BoxSizer前の要素の上にスライドする後の要素

どのように比率を設定したかに関係なく (少なくとも上記の 2 つのオプションの間で)、後者の項目は相互に関連して期待どおりに動作します。ただし、ボックスが小さくなると、最初の要素の上をスライドします。そのため、_GenerateViewPanels()(いつものように) パネルを戻すと、パネルが上にスライドして上部のツールバーを覆います。何もしないようにすると (通常のパネルは生成されません)、次のツールバーが上にスライドして一番上のツールバーを覆います。繰り返しますが、下部のツールバーやパネルはどれも、そのように相互作用しません。彼らは最初のツールバーでのみそれを行います。前と同じように、私は混乱しています。ここで何が起こっているのでしょうか?

[編集:上記のコードを完全に機能するサンプル アプリケーションにしました。]


ノート:

  1. 私は Phoenix の wxPython スナップショット ビルドを使用しています。具体的2.9.5.81-r73784には、Windows 7 と OS X の両方で Python 3.3 に対して実行しています。これはスナップショット ビルドの問題である可能性がありますが、疑わしいです。
  2. Proportion()Sizer に要素を追加するための基本的な引数の派手なラッパーです。proportion=<value>を試した理由については、 への引数-1のデフォルト/ベース値を間違って覚えていました。proportionBoxSizer.Add()
4

1 に答える 1