3

私は wxpython を学習しており、ネストされたパネルを機能させようとしています。これは、より複雑な画面を準備するための演習です。そのため、少し複雑に見えるかもしれませんが、それには目的があります ;)。私がやりたいことは次のとおりです。 トップフレームを作成する パネルを追加する テキストと入力フィールドを追加する 垂直ボックスサイザーを使用してパネルレイアウトを行う これが私がそれをどのように実装したかです:

import wx
class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent)

        #add position panel
        posPnl = wx.Panel(self)
        lbl1 = wx.StaticText(posPnl, label="Position")
        lbl2 = wx.StaticText(posPnl, label="Size")
        sizeCtrl = wx.TextCtrl(posPnl)

        posPnlSzr = wx.BoxSizer(wx.HORIZONTAL)
        posPnlSzr.Add(lbl1, 1, wx.GROW)
        posPnlSzr.Add(sizeCtrl, 1, wx.GROW)
        posPnlSzr.Add(lbl2, 1, wx.GROW)   

        #create a top leverl sizer to add to the frame itself
        mainSzr = wx.BoxSizer(wx.VERTICAL)
        mainSzr.Add(posPnlSzr)

        self.SetSizerAndFit(mainSzr)
        self.Show()


app = wx.App(False)
frame = MainWindow(None, "Trading Client")
app.MainLoop()

「Pos」という単語が表示された小さな空白の画面しか表示されません。ここで何が間違っていますか?

4

2 に答える 2

4

ここでのロジックは、Panel内部にコントロールを追加するを作成し、追加BoxSizerした各コントロールがPanelサイズ変更でどのように動作するかを宣言し、最終的に適用されるPanelものを設定することです。BoxSizer

2 つの問題があります。

  • まず、posPnlオブジェクトに対する上記のステートメントの最後の部分がありません。これを追加:

    posPnl.SetSizer(posPnlSzr)
    

    コントロールを追加したらposPnlSzr

  • 2 番目の問題はposSnlSzrmainSzr. そうするのは間違っています。ここでも、ロジックはサイザーにコントロールを追加することでありPanel、複合コントロールとして表示できます。したがって、正しいコードはに追加posPnlすることmainSzrです:

    mainSzr.Add(posPnl)
    

    posPnl私が読んだ限りでは、メイン ウィンドウで自動的にサイズ変更しようとしています。mainSzr実際にサイズが変更されるようにパネルを追加する場合:

    mainSzr.Add(posPnl, 1, wx.GROW)
    

これにより、最終的なソース コードが得られます。

#!/usr/bin/env python

import wx
class MainWindow(wx.Frame):
    def __init__(self, parent, title):
        wx.Frame.__init__(self, parent)

        #add position panel
        posPnl = wx.Panel(self)
        lbl1 = wx.StaticText(posPnl, label="Position")
        lbl2 = wx.StaticText(posPnl, label="Size")
        sizeCtrl = wx.TextCtrl(posPnl)

        posPnlSzr = wx.BoxSizer(wx.HORIZONTAL)
        posPnlSzr.Add(lbl1, 1, wx.GROW)
        posPnlSzr.Add(sizeCtrl, 1, wx.GROW)
        posPnlSzr.Add(lbl2, 1, wx.GROW)

        posPnl.SetSizer(posPnlSzr)

        #create a top leverl sizer to add to the frame itself
        mainSzr = wx.BoxSizer(wx.VERTICAL)
        mainSzr.Add(posPnl, 1, wx.GROW)

        self.SetSizerAndFit(mainSzr)
        self.Show()


app = wx.App(False)
frame = MainWindow(None, "Trading Client")
app.MainLoop()
于 2012-05-28T15:09:59.817 に答える
0

私のアプリケーションの基本的な形式は次のようになります (親 --> 子):

フレーム --> パネル --> サイズ変更 --> ウィジェット/サイズ変更

特定のことについて、私はこれを行います:

フレーム --> サイズ調整 --> パネル --> サイズ調整 --> ウィジェット/サイズ調整

私はネストサイザーがその時です。新しいプログラマーは通常、GUI を紙にスケッチしてから、それらの周りにボックスを描画して、どのサイザーが機能するか、どこにネストするかなどを理解しようとします。

self.SetSizerAndFit(mainSzr)posPnl.SetSizerAndFit( mainSzr) に変更するだけで、この問題を解決できます。

于 2012-05-29T13:58:32.640 に答える