2

Python 用の WX フォーム ビルダーでダッシュ ボードを設計しようとしています。垂直サイザーの子である2つの水平サイザーが互いに大きく離れないようにする方法を理解するのに苦労しています。以下は、私が言及していることを説明するスクリーンショットです。

ここに画像の説明を入力

青い矢印は、テキスト ボックス コントロールとラベルを最初のラベルに近づけたいことを表しています。

私の最初の本能は、wx.EXPAND などのフラグと関係があるということですが、サイザーを互いに近づける方法でそれらを変更することはできませんでした。サイザーを配置するたびに、ウィンドウ全体にすべてを自動的に収めようとするようなものです...これにより、フォーム上の正確な位置にアイテムを配置することが難しくなります。サイザーがフレーム ウィンドウ サイズ全体に拡大しないようにする方法について何か提案はありますか?

私の次の行動方針は、グリッドサイザーまたはフレックスグリッドサイザーを試して使用することでしたが、ウィジェットまたはオブジェクトを追加するグリッド内の正確な場所を選択できる直接コードでのみ使用しました。フォームビルダーでは、主にグリッドサイザーの特定のインデックスにオブジェクトを挿入できないため、使いにくいことがわかりました。それらを順番に挿入します。

1,1 -> 1,2 -> 1,3 -> 1,i -> 2,1 -> 2,2 -> 2,3 -> 2,i -> j,i

つまり、グリッド内の何かを変更する必要がある場合は...非常に困難です。オブジェクトを順番にではなく、グリッドに簡単に挿入できるようにするために欠けているものはありますか?

以下は、水平方向と垂直方向の両方のギャップ = 0 を指定した 5x5 グリッドサイザー (完全に埋められていない) の例の 1 つです。

ここに画像の説明を入力 ここに画像の説明を入力

ボタンを 1,4 のテキスト ボックスに置き換えることができることに加えて、垂直方向と水平方向のギャップに 0 を指定したにもかかわらず、水平方向のギャップが明らかにゼロではないことに気付きました。これにより、フォームの設計も非常に難しくなります。ボタン間に横方向の隙間があるのはなぜですか?

4

2 に答える 2

3

お気づきのように、サイザーを使用すると「もの」が収まるように拡張され、適切に使用されないと、プロポーション フラグがレイアウトに大混乱をもたらす可能性があります。
この単純なコードで遊んでください。

import wx

class Summary(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, None, wx.ID_ANY, "Playing with Simple Sizers", size=(430,260))

        self.panel = wx.Panel(self, wx.ID_ANY)
        self.log = wx.TextCtrl(self.panel, wx.ID_ANY, value="input1:",size=(428,25))
        self.log2 = wx.TextCtrl(self.panel, wx.ID_ANY, value="input2:", size=(428,25))
        self.quit_button = wx.Button(self.panel, label="Quit",size=(60,25))
        self.button1= wx.Button(self.panel, label="1",)
        self.button2 = wx.Button(self.panel, label="2",size=(60,25))
        self.button3 = wx.Button(self.panel, label="3",size=(60,25))
        self.button4 = wx.Button(self.panel, label="4",size=(60,25))
        self.quit_button.Bind(wx.EVT_BUTTON, self.OnQuit)

        vbox = wx.BoxSizer(wx.VERTICAL)
        hbox1 = wx.BoxSizer(wx.HORIZONTAL)
        hbox2 = wx.BoxSizer(wx.HORIZONTAL)
        hbox3 = wx.BoxSizer(wx.HORIZONTAL)
        hbox4 = wx.BoxSizer(wx.HORIZONTAL)

        vbox.Add(self.quit_button, 0, wx.ALL|wx.EXPAND, 1)
        hbox1.Add(self.log, 0, wx.ALL|wx.EXPAND, 1)
        hbox2.Add(self.log2, 0, wx.ALL|wx.EXPAND, 1)

        hbox3.Add(self.button1, 1, wx.ALL|wx.EXPAND, 1)
        hbox3.Add(self.button2, 2, wx.ALL|wx.EXPAND, 1)
        hbox4.Add(self.button3, 0, wx.ALL|wx.EXPAND, 1)
        hbox4.Add(self.button4, 1, wx.ALL|wx.EXPAND, 1)

        vbox.Add(hbox1, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
        vbox.Add(hbox3, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
        vbox.Add(hbox4, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)
        vbox.Add(hbox2, 0, wx.ALIGN_RIGHT|wx.EXPAND, 1)

        self.panel.SetSizer(vbox)
        self.Show()

    def OnQuit(self, event):
        self.Close()
# Run the program
if __name__ == "__main__":
    app = wx.App()
    frame = Summary()
    app.MainLoop()

プロポーション フラグは、サイザーに追加するときの 2 番目のパラメーターです。
ボタンに対して 0、1、および 2 に設定されていることに注意してください。それらを変更して、ボタン同士の関係でボタンに何が起こるかを確認し、ボタンのサイズ パラメータを操作します。
self.log または self.log2 の比率フラグを 1 に変更し、それが拡大するのを確認します。
最後にフレームサイズを広くして反応を見てみます。
サイザーは最初は非常にイライラすることがありますが、一度「理解」すると強力なツールになります。

于 2015-09-28T15:33:55.037 に答える
1

sizer のproportion0 (ゼロ) にするだけです。割合が 0 より大きい場合、レイアウト エンジンはこの値に従ってスペースを割り当てようとします。ほとんどの場合、私はプロポーションを 0 にすることを好みます。

wx.GridSizer は使っていませんが、よく使っていますwx.GridBagSizer。ウィジェットを wx.GridBagSizer に順番に追加したり、セルごとにウィジェットを配置したりする必要はありません。期待どおりに機能します。wxformbuilder のパネルに wx.GridBagSizer を追加し、それにウィジェットを追加します。下のオブジェクト プロパティからウィジェットの を変更でき、変更row後にそれに応じて配置されます。columngbsizeritem

残念ながら、ウィジェットの場所を変更したり、新しいウィジェットを追加したりする場合は、行と列の値を更新する必要があります。これは避けられません。

于 2015-09-28T01:23:54.727 に答える