2012-05-28 37 views
3

我正在學習wxpython並嘗試使嵌套面板工作。這是一個爲更復雜的屏幕做準備的練習,因此它可能看起來有點複雜,但這是有目的的;)。 我想要做的是以下幾點: 創建頂部框架 添加面板使其 添加一些文本和輸入域將其 使用垂直boxsizer做面板佈局 這裏是我是如何實現它:如何在wxpython中使嵌套面板和Sizer工作

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

這裏的邏輯是創建一個Panel裏面添加控件,那麼在這裏你聲明每次在Panel添加控制如何與調整的行爲,並最終對Panel設置BoxSizer是什麼應用就可以了BoxSizer

您有2個問題。

  • 首先,您錯過了posPnl對象的上述語句的最後一部分。補充一點:

    posPnl.SetSizer(posPnlSzr) 
    

    ,一旦你已經添加的控件到posPnlSzr

  • 的第二個問題是,你在你的mainSzr加入posSnlSzr。這樣做是錯誤的。再次,邏輯是將控件添加到sizer中,並且您可以將Panel視爲複合控件。因此,正確的代碼是添加posPnlmainSzr

    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() 
+0

謝謝,這真的很有幫助和清楚。其中一個問題是:你是否真的認爲你不應該將sizer添加到sizer中?我在很熟悉的教程中也看到了很多。 – Django

+2

@Django:我不認爲Boud說你永遠都不應該將sizer添加到sizer中,只是在這種情況下,你試圖將StaticTexts和TextCtrls添加到面板上,而是將它添加到Frame中。該框架包含mainSizer,其中包含posPnlSzr。 posPnl不包含posPnlSzr也不包含posPnl。問題是posPnl從未真正被使用。 Boud的代碼修復了這個問題。 – acattle

0

我的應用程序的基本形式是這樣的(parent - > child):

frame - > panel - > sizer - > widgets/sizers

對於某些事情,我這樣做:

幀 - >分級器 - >面板 - >分級器 - >窗口小部件/尺寸確定器

我窩大小測定器是時間。當你是一個新的程序員時,你通常希望在紙上畫出你的GUI,然後在他們周圍繪製盒子來試圖找出哪些尺寸設定器工作,在哪裏嵌套它們等。

你可以修復這個問題只是通過改變self.SetSizerAndFit(mainSzr)posPnl。SetSizerAndFit(mainSzr)