0

内部に ScrolledWindow を含むダイアログと、その ScrolledWindow に動的な数のコントロールがあります。

現在、ダイアログは十分な大きさではありません。幅と高さを手動で設定することもできますが、それらがどうなるかわからないので、サイザーにサイズを自動的に設定してもらいたいのですが、これは wxWidgets が望んでいる方法だと思います。

ScrolledWindow にはサイザーがあり、サイズ要件を正しく計算しているようです。

ScrolledWindow を Dialog のサイザーに追加しましたが、Dialog のサイザーはそのサイズ計算で ScrolledWindow のサイズを考慮していないようです。

以下のログは、私の問題を示しています。scrolling_window と scrolling_window_sizer はサイズが (267, 480) であると信じているのに、dialog_sizer は (210, 63) で済むと考えているのはなぜですか? なんで?

scrolling window best size (14, 14)
scrolling window client size (267, 480)
scrolling window effect min size (14, 14)
scrolling window min client size (-1, -1)
scrolling window min size (-1, -1)
scrolling window size (267, 480)
scrolling window virtual size (267, 480)
scrolling window best virtual size (267, 480)

scrolling_window_sizer after layout fit GetSize (267, 480)
scrolling_window_sizer after layout fit GetMinSize (267, 480)
scrolling_window_sizer after layout fit ComputeFittingClientSize(self) (267, 480)
scrolling_window_sizer after layout fit ComputeFittingWindowSize(self) (267, 480)

dialog_sizer after add scrolling window GetSize (0, 0)
dialog_sizer after add scrolling window GetMinSize (24, 24)
dialog_sizer after add scrolling window ComputeFittingClientSize(self) (24, 24)
dialog_sizer after add scrolling window ComputeFittingWindowSize(self) (24, 24)
dialog_sizer after add buttons GetSize (0, 0)
dialog_sizer after add buttons GetMinSize (210, 63)
dialog_sizer after add buttons ComputeFittingClientSize(self) (210, 63)
dialog_sizer after add buttons ComputeFittingWindowSize(self) (210, 63)

dialog best size (210, 63)
dialog client size (210, 63)
dialog effect min size (210, 63)
dialog min client size (-1, -1)
dialog min size (-1, -1)
dialog size (210, 63)
dialog virtual size (210, 63)
dialog best virtual size (210, 63)
Traceback (most recent call last):
  File "gui/klt_gui.py", line 208, in on_cancel_button_click
    raise NotImplementedError
NotImplementedError

これは wxPython を使用した python であることに注意してください。これはコードの大きなダンプですが、読みやすいほど簡単であることを願っています。上記のログを出力した行は #! でマークされています。

この行: # この行は問題です。それがなければ、サイザーがウィンドウを自動的に調整するとは思いません。それに伴い、窓が小さい。サイズ = dialog_sizer.Fit(self) self.Layout()

サイザーにダイアログのサイズを変更させるために、自分自身を追加しました。Fit pre-layout または post-layout を実行する必要があるかどうかはわかりませんが、上記のログで示されているように、サイザーはボタンを考慮していないように見えますが、スクロールは考慮していないようです。窓。

class AddEditCustomerDialog(wx.Dialog):
    # Based on EditCustomerTemplateFrame generated by wxFrameBuilder

    @staticmethod
    def make_section_frame(parent, parent_sizer, section_name, field_names):
        static_box = wx.StaticBox(parent, wx.ID_ANY, section_name)
        section_static_box_sizer = wx.StaticBoxSizer(static_box, wx.VERTICAL)

        flex_grid = wx.FlexGridSizer(0, 2, 5, 5)
        flex_grid.AddGrowableCol(1)
        flex_grid.SetFlexibleDirection(wx.HORIZONTAL)
        flex_grid.SetNonFlexibleGrowMode(wx.FLEX_GROWMODE_ALL)

        # do we need to keep these around? I guess for getting text etc
        text_boxes = []

        for field_name in field_names:
            label = wx.StaticText(static_box, label=field_name)
            label.Wrap(-1)
            flex_grid.Add(label, 0,
                          wx.ALIGN_CENTER_VERTICAL | wx.ALIGN_RIGHT | wx.ALL,
                          5)

            # value=, validator=, name =??
            text_box = wx.TextCtrl(static_box)
            flex_grid.Add(text_box, 1, wx.ALL | wx.EXPAND, 5)

        section_static_box_sizer.Add(flex_grid, 1, wx.ALL | wx.EXPAND, 5)
        parent_sizer.Add(section_static_box_sizer, 1, wx.ALL | wx.EXPAND, 5)

    def add_dialog_buttons(self, add_or_edit, parent, parent_sizer):
        # ok, cancel buttons:
        dialog_buttons = wx.StdDialogButtonSizer()

        self.save_button = wx.Button(parent, wx.ID_SAVE)
        self.cancel_button = wx.Button(parent, wx.ID_CANCEL)
        dialog_buttons.AddButton(self.save_button)
        dialog_buttons.AddButton(self.cancel_button)

        if add_or_edit == "Edit":
            self.apply_button = wx.Button(parent, wx.ID_APPLY)
            dialog_buttons.AddButton(self.apply_button)

        dialog_buttons.Realize()
        parent_sizer.Add(dialog_buttons, 0,
                         wx.ALIGN_BOTTOM | wx.ALIGN_RIGHT | wx.ALL | wx.EXPAND,
                         5)

        # Connect Events
        if add_or_edit == "Edit":
            self.apply_button.Bind(wx.EVT_BUTTON, self.on_apply_button_click)
        self.cancel_button.Bind(wx.EVT_BUTTON, self.on_cancel_button_click)
        self.save_button.Bind(wx.EVT_BUTTON, self.on_save_button_click)

    def __init__(self, parent, add_or_edit, config):
        assert add_or_edit in ['Add', 'Edit']

        wx.Dialog.__init__(self, parent,
                           title=add_or_edit + " Customer",
                           style=wx.DEFAULT_DIALOG_STYLE | wx.RESIZE_BORDER | wx.STAY_ON_TOP)

        self.SetSizeHintsSz(wx.DefaultSize, wx.DefaultSize)
        dialog_sizer = wx.BoxSizer(wx.VERTICAL)

        scrolling_window = wx.ScrolledWindow(self, wx.ID_ANY,
                                             wx.DefaultPosition,
                                             wx.DefaultSize,
                                             wx.HSCROLL | wx.VSCROLL)
        scrolling_window.SetScrollRate(5, 5)
        scrolling_window_sizer = wx.BoxSizer(wx.VERTICAL)

        self.make_section_frame(scrolling_window,
                                scrolling_window_sizer,
                                "LOL", ["test", "two", "three"])
        self.make_section_frame(scrolling_window,
                                scrolling_window_sizer,
                                "rofl", ["12323 3 2 1 3 21 3 2", "abc", "123"])
        self.make_section_frame(scrolling_window,
                                scrolling_window_sizer,
                                "heehhee", ["sd f  ", "fdsf dsd ", "fff"])

        scrolling_window.SetSizer(scrolling_window_sizer)
        scrolling_window.Layout()
        scrolling_window_sizer.Fit(scrolling_window)
        self.print_window_sizes(scrolling_window, "scrolling window") #!

        self.print_sizer(scrolling_window_sizer, scrolling_window,
                         "scrolling_window_sizer after layout fit") #!
        dialog_sizer.Add(scrolling_window, 1, wx.ALL | wx.EXPAND, 5)
        self.print_sizer(dialog_sizer, self,
                         "dialog_sizer after add scrolling window") #!

        self.add_dialog_buttons(add_or_edit, self, dialog_sizer)

        self.SetSizer(dialog_sizer)

        self.print_sizer(dialog_sizer, self, "dialog_sizer after add buttons") #!


        # This line is a problem. Without it, I don't think the sizer will automatically adjust the window. With it, the window is tiny.
        size = dialog_sizer.Fit(self)

        self.Layout()
        self.Centre(wx.BOTH)
        self.print_window_sizes(self, "dialog") #!


    @staticmethod
    def print_window_sizes(scrolling_window, window_name):
        print(window_name, "best size", scrolling_window.GetBestSize())
        print(window_name, "client size", scrolling_window.GetClientSize())
        print(window_name, "effect min size", scrolling_window.GetEffectiveMinSize())
        print(window_name, "min client size", scrolling_window.GetMinClientSize())
        print(window_name, "min size", scrolling_window.GetMinSize())
        print(window_name, "size", scrolling_window.GetSize())
        print(window_name, "virtual size", scrolling_window.GetVirtualSize())
        print(window_name, "best virtual size", scrolling_window.GetBestVirtualSize())

    @staticmethod
    def print_sizer(sizer, window, sizer_name):
        print(sizer_name, "GetSize", sizer.GetSize())
        print(sizer_name, "GetMinSize", sizer.GetMinSize())
        print(sizer_name, "ComputeFittingClientSize(self)",
              sizer.ComputeFittingClientSize(window))
        print(sizer_name, "ComputeFittingWindowSize(self)",
              sizer.ComputeFittingWindowSize(window))

    def on_apply_button_click(self, event):
        event.Skip()
        raise NotImplementedError

    def on_cancel_button_click(self, event):
        event.Skip()
        raise NotImplementedError

    def on_save_button_click(self, event):
        event.Skip()
        raise NotImplementedError

app = wx.App(False)
AddEditCustomerDialog(None, "Add", None).Show(True)
app.MainLoop()

コード自体はほとんど wxFormBuilder によって生成され、動的にするために私自身が変更を加えました。wxFormBuilder によって作成されたコードが正しいと仮定しています。しかし、あなたがそれが間違っていて間違った順序で何かをしている、または私がひどく変更したと思う場合に備えて、ここにあります;)

.fbp: https://gist.github.com/Poddster/bf203294e0267d3da575f297fa5bb0a6
出力コード: https://gist.github.com/Poddster/684896817452c3657ad65f86263a0a7a

4

0 に答える 0