4

私は wxPython を学んでいて、学生情報マネージャーを書こうとしています。私は長年 CLI プログラムを書いてきたので、GUI を作成した経験はあまりありません。

まず、UI の青写真を描きました。 UI の青写真

次に、wxPython で作成しようとしましたが、サイザーは本当に私を夢中にさせています。私はこれまでサイザーを使用したことがありませんでした。(Visual Basic は私が最初に学んだ言語でした ^__^)

最後に、次のコードを書きました。

import wx
from wx.lib import sheet


class Sheet(sheet.CSheet):
    def __init__(self, parent, row, col):
        sheet.CSheet.__init__(self, parent)
        self.row = self.col = 0
        self.SetNumberRows(row)
        self.SetNumberCols(col)

        for i in range(row):
            self.SetRowSize(i, 20)


class ChartPanel(wx.Panel):
    '''This is the panel for the chart, but the still working on it. '''
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)


class MainPanel(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)
        sizer = wx.GridBagSizer(5, 5)

        # However, just put the chart into main frame.
        chart = ChartPanel(self)
        chart.SetBackgroundColour("blue")

        Students = Sheet(self, 5, 2)
        History = Sheet(self, 2, 2)

        button1 = wx.Button(self, label="Button #1")
        button2 = wx.Button(self, label="Button #2")
        button3 = wx.Button(self, label="Button #3")

        sizer.Add(Students, pos=(0, 0), span=(5, 2), flag=wx.EXPAND)
        sizer.Add(History, pos=(0, 2), span=(2, 2), flag=wx.EXPAND)
        sizer.Add(chart, pos=(2, 2), span=(3, 2), flag=wx.EXPAND)

        sizer.Add(button1, pos=(5, 0), span=(1, 1))
        sizer.Add(button2, pos=(5, 1), span=(1, 1))
        sizer.Add(button3, pos=(5, 2), span=(1, 1))

        sizer.AddGrowableCol(5)
        sizer.AddGrowableRow(5)

        self.SetSizer(sizer)
        self.Fit()


class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="BoxSizer Example")
        panel = MainPanel(self)
        self.Show()

if __name__ == "__main__":
    app = wx.App(False)
    frame = MainFrame()
    app.MainLoop()

しかし、このプログラムは醜くてバグがあります。誰かがサイザーのスマートな使い方を教えてくれませんか? また、私のコードを修正するのを手伝ってくれませんか?

どうもありがとう!

4

1 に答える 1

3

まず、エラーが発生したためAddGrowableColumn()、行を削除する必要がありました。私はそれらの関数のドキュメントAddGrowableRow()を読みましたが、それらを呼び出したくないと思います (ただし、UI をどのように表示したいかを知っているのはあなただけです)。

あなたは実際、サイザーについてかなりよく理解しているようです。問題はMainPanel、 のサイズがわからないMainFrameため、UI の一部が切り取られていることです。この問題を解決するのは非常に簡単で、2 つのオプションがあります。

オプション 1
では、サイザー内MainFrame.__init__()に配置します。panelこれにより、サイザーは のサイズにpanel基づいて のサイズを設定できMainFrameます。現在、それらのサイズの間に関連性はありません。変更は次のようになります。

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="BoxSizer Example")
        panel = MainPanel(self)
        sizer = wx.BoxSizer(wx.HORIZONTAL)
        sizer.Add(panel)
        self.SetSizer(sizer) #this allows panel and MainFrame to influence each other's sizes
        self.Show()
        self.Fit()

オプション 2
MainFrameには、オブジェクトが 1 つしかありませんMainPanel。では、これら 2 つのクラスを 1 つにまとめてみませんか? すべてのコードを から に追加してから、MainPane1MainFrame削除するだけMainPanelです。重要な部分はMainPanel.__init__()SetSizer(). そのコードを に移動するとMainFrame.__init__()、オプション 1 で提案したことを正確に行っていることになりますが、クラスが 1 つ少なくなります。それは次のようになります。

class MainFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, None, title="BoxSizer Example")
        sizer = wx.GridBagSizer(5, 5)

        # However, just put the chart into main frame.
        chart = ChartPanel(self)
        chart.SetBackgroundColour("blue")

        Students = Sheet(self, 5, 2)
        History = Sheet(self, 2, 2)

        button1 = wx.Button(self, label="Button #1")
        button2 = wx.Button(self, label="Button #2")
        button3 = wx.Button(self, label="Button #3")

        sizer.Add(Students, pos=(0, 0), span=(5, 2), flag=wx.EXPAND)
        sizer.Add(History, pos=(0, 2), span=(2, 2), flag=wx.EXPAND)
        sizer.Add(chart, pos=(2, 2), span=(3, 2), flag=wx.EXPAND)

        sizer.Add(button1, pos=(5, 0), span=(1, 1))
        sizer.Add(button2, pos=(5, 1), span=(1, 1))
        sizer.Add(button3, pos=(5, 2), span=(1, 1))

        #I removed these lines because they gave me errors and I don't understand why you needed them
        #sizer.AddGrowableCol(5) 
        #sizer.AddGrowableRow(5)

        self.SetSizer(sizer)
        self.Fit()
        self.Show()

最後に、私は を使うのが好きではありませんwx.GridBagSizer。ネストされたwx.BoxSizerオブジェクトを使用することを好みます。UI をより小さなチャンクに分割しているため、コードだけで UI がどのように見えるかを視覚化できるようになり、より詳細に制御できるようになりました。ただし、これは個人的な好みの問題であり、理解し、快適に使用できる方法を使用する必要があります。設計図を見ると、2 つの列があることがわかります。そのため、最初にこれらの列を処理するサイザーが必要です。次に、各列を 2 つの行に分割できます。ボタンには、ボタンを保持するためのサイザーがもう 1 つ必要です。コードは次のようになります。

def __init__(self, parent):
    wx.Panel.__init__(self, parent)
    mainSizer = wx.BoxSizer(wx.HORIZONTAL) #this will make the columns

    rightSizer = wx.BoxSizer(wx.VERTICAL) #this will be the rows on the right
    # However, just put the chart into main frame.
    chart = ChartPanel(self)
    chart.SetBackgroundColour("blue")
    History = Sheet(self, 2, 2)

    rightSizer.Add(History, 1, wx.EXPAND)
    rightSizer.Add(chart, 1, wx.EXPAND)

    leftSizer = wx.BoxSizer(wx.VERTICAL) #this will be the rows on the left
    Students = Sheet(self, 5, 2)

    buttonSizer = wx.BoxSizer(wx.HORIZONTAL) #this will organize the buttons
    button1 = wx.Button(self, label="Button #1")
    button2 = wx.Button(self, label="Button #2")
    button3 = wx.Button(self, label="Button #3")

    buttonSizer.Add(button1)
    buttonSizer.Add(button2)
    buttonSizer.Add(button3)

    leftSizer.Add(Students, 1, wx.EXPAND)
    leftSizer.Add(buttonSizer)

    mainSizer.Add(leftSizer, 1, wx.EXPAND)
    mainSizer.Add(rightSizer, 1, wx.EXPAND)

    self.SetSizer(mainSizer)
    self.Fit()
于 2012-09-01T02:45:35.643 に答える