2014-05-25 64 views
0

確定這對你很簡單。 :)但我試圖打開一個「首選項」菜單,並彈出並顯示應用程序存儲的首選項。我的問題現在是化妝品,我不知道我的應用程序左上角的小「俄羅斯方塊片」是什麼。這是我想填補整個框架的顏色,但我無法弄清楚如何做到這一點。wxPython面板是兩個灰色陰影?

這裏有一個形象:

enter image description here

這裏是我的面板代碼重用:

def __init__(self): 
    """Constructor""" 
    import wx.lib.inspection 
    wx.lib.inspection.InspectionTool().Show()      

    wx.Frame.__init__(self, None, title="Title Options", size=(520, 390)) 

    prefPanel = wx.Panel(self) 
    prefPanel = self 

    # SET THE SIZER OBJECT UP 
    prefSizer = wx.GridBagSizer(13, 9) 

    # SET BASELINE INDEX VARIABLES 
    xIndex = 0 
    yIndex = 0 

# DEFAULT DATABSE EXTENSIONS 
    self.tc_DBExt = wx.TextCtrl(prefPanel, -1, "", (0,0), (150,21)) 
    self.label_DBExt = wx.StaticText(prefPanel, label="Default Database Extensions:") 
    help_tc_DBExt= "Enter this as: *.<extension>" 
    self.tc_DBExt.SetToolTip(wx.ToolTip(help_tc_DBExt))   
    self.tc_DBExt.Value = guiFunctions.configMe("general", "database_extensions") 

    prefSizer.Add(self.label_DBExt, pos=(xIndex, 0), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10) 
    prefSizer.Add(self.tc_DBExt, pos=(xIndex, 1), span=(1,5), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10).SetMinSize((200,22)) 


    panel.SetSizer(sizer2) 
    sizer2.Fit(panel) 

    panel.Refresh() 
    panel.Update() 
    panel.Layout() 

如何讓小傢伙了在左邊角落,填補了:在使用分級機整個面板?

UPDATE:的情況下添加小部件的信息,我正在申請的事以錯誤的順序...

回答

2

簡答回答:您可能有也可能沒有父面板,但您沒有正確設置尺寸。由於Windows上的wx.Frame具有深灰色背景,因此如果您不使用wx.Panel(並使其尺寸正確),它將發光。

長答案:試圖從您的代碼中包含一個最小的運行示例。它看起來很醜陋(TextCtrlButton),因爲定義panel來自外部,並且很難同步它們的尺寸。在全部元素創建/調整在一個wx.Panel/wx.Frame將是好得多。我所有對你的代碼的評論都包含在三重引號中,並且應該讓你明白爲什麼你要做的事情很複雜/不好/簡單不起作用。

import wx 

class panel_class(wx.Panel): 
    def __init__(self, *args, **kwds): 
     """Trying to implement your magic ``panel```""" 
     wx.Panel.__init__(self, *args, **kwds) 
     pnl = self 
     szmain = wx.BoxSizer(wx.HORIZONTAL) 
     szmain.Add(wx.TextCtrl(pnl, -1, 'Database path'), 1, wx.EXPAND) 
     szmain.Add(wx.Button(pnl, -1, 'Database path'), 0, wx.EXPAND) 
     pnl.SetSizer(szmain) 


class myframe(wx.Frame): 
    def __init__(self, *args, **kwds): 
     """Constructor""" 

     wx.Frame.__init__(self, *args, **kwds)#None, title="Title Options", size=(520, 390)) 

     prefPanel = wx.Panel(self) 

     """This makes no sense: according to the wx.Frame.__init__ above self is a wx.Frame.""" 
#   prefPanel = self 

     # SET THE SIZER OBJECT UP 
     prefSizer = wx.GridBagSizer(13, 9) 

     # SET BASELINE INDEX VARIABLES 
     xIndex = 0 
     yIndex = 0 

     # DEFAULT DATABSE EXTENSIONS 
     self.tc_DBExt = wx.TextCtrl(prefPanel, -1, "", (0,0), (150,21)) 
     self.label_DBExt = wx.StaticText(prefPanel, label="Default Database Extensions:") 
     help_tc_DBExt= "Enter this as: *.<extension>" 
     self.tc_DBExt.SetToolTip(wx.ToolTip(help_tc_DBExt)) 
     """Replaced with something static.""" 
     self.tc_DBExt.Value = 'conftxt'#guiFunctions.configMe("general", "database_extensions") 

     prefSizer.Add(self.label_DBExt, pos=(xIndex, 0), flag=wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10) 
     prefSizer.Add(self.tc_DBExt, pos=(xIndex, 1), span=(1,5), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10).SetMinSize((200,22)) 

     """Assuming panel definition from outside. 

     It has to be created here. If it is to be created **before** 
     the parent is created, it is very complicated to create it with a 
     dummy parent and ``Reparent`` it to this Frame/Panel. Don't do that.""" 

     panel = panel_class(prefPanel, -1) 

     """Attach ``panel`` to a sizer in **this** hierarchy 
     It looks disconnected, because it has brought already it's own 
     sizer, which is child to the GridBagSizer.""" 
     xindex = 1 
     prefSizer.Add(panel, pos=(xindex, 0), span=(1,5), flag=wx.EXPAND|wx.LEFT|wx.ALIGN_CENTER_VERTICAL|wx.TOP, border=10).SetMinSize((200,22)) 

     """You have to tell wxPython somehow to what element the sizer is coupled (in this case to the main pane)l""" 
     prefPanel.SetSizer(prefSizer) 

     """I have no idea """ 
     #panel.SetSizer(sizer2) 
     #sizer2.Fit(panel) 

     """Normally not needed/happening automagically on standard controls"""  
     #panel.Refresh() 
     #panel.Update() 
     #panel.Layout() 

    def add_panel_to_layout(self): 
     pass 

if __name__ == '__main__': 
    app = wx.App(0) 

    frm = myframe(None, -1, title="Title Options", size=(520, 390)) 

    frm.Show() 

    """Call it here **after** all elements have been created""" 
    import wx.lib.inspection 
    wx.lib.inspection.InspectionTool().Show() 
    app.MainLoop() 

規則在wxPython中與尺寸儀工作:

  • 始終使用wx.Panel作爲父母你的控制。無論您的控件本身是否在面板上進行操作,您都可以根據需要將它們堆疊在任意層上。如果你的家長直接到wx.Frame,你會在Windows上看到醜陋的灰色背景。
  • 定義您的控制對象(可以再次面板)
  • 選擇合適的定徑機
  • 佈局篩分器所有的元素
  • 重要:告訴你的主分級機到父元素來定位本身(main_panel.SetSizer(mymainsizer)
  • 告訴主面板的面板父的大小以適應(mymainsizer.Fit(self)其中篩分器,假設selfmain_panel父。使用self.SetSize((<w>, <h>))如果Fit出錯。

Example sizer for this question

+0

由於它是最完整和最具建設性的答案,因此它已被接受 - 謝謝 - 它工作得非常好。 – chow

1

您還需要設置panel爲其他控件不frame的父。

你更新的代碼顯示了另一個問題:

prefPanel = wx.Panel(self) 
prefPanel = self 

這是完全錯誤的。

提示:要診斷這類問題,您可以運行Widget Inspection Control

+0

我在哪裏可以設置面板作爲父級? (我對此非常感興趣:) :) – chow

+0

在每個控件的創建者,即按鈕,文本字段,靜態文本中,都有一個父參數,通常是/總是第一個參數。 –

1

你有一些不正確的對象,可能是因爲你致電panel = self。當你這樣做時,你告訴解釋器使用你的框架而不是你的面板作爲你以後試圖通過類似wx.StaticText(panel)創建的任何東西。另外可疑的是需要致電global sizer2。您如何/爲什麼在使用前聲明sizer大小,以至於他們需要全局關鍵字?

+0

刪除全球sizer2,無法記住我在那裏試圖做什麼。沒有負面影響任何事情。我的其他選擇是什麼,而不是'parent = self'?如果我刪除它,它會顯示LESS而不是其中的內容(所有靜態標籤消失,只有瀏覽按鈕出現?) – chow

0

這是一個教養問題:

prefPanel = wx.Panel(self) 
prefPanel = self 

首先你設置prefPanel對象是一個wx.Panel,那麼您可以覆蓋它,並把它設回幀(即自)。刪除第二行,代碼應該正常工作。

你幾乎總是希望有一個面板作爲一個框架的唯一孩子。其他一切都應該是小組的一個孩子。這給了正確的着色。它還支持在小部件之間進行選項卡的功能。