2010-07-17 92 views
2

Can a wx.PyControl can contain a wx.SizerwxPython:wx.PyControl是否可以包含一個wx.Sizer?

請注意,我最終試圖在這裏做什麼(微調浮動值)已經在另一個問題中回答。我特別感興趣的是在wx.PyControl內部佈置小部件,如果我遇到需要製作自己的自定義小部件的技巧,這項技巧可能會很有用。我已經閱讀了CreatingCustomControls,但它沒有在wx.PyControl子類中使用sizer。我的CustomWidget只是看起來不正確。我還沒有執行DoGetBestSize,因爲我認爲這適用於wx.Sizer代理上的小部件。我實際上有一個wx.Sizer做它的東西裏面 a CustomWidget

這裏是我的代碼(無子部件之間的事件綁定):
編輯:這裏是我糾正類代碼,這要歸功於Steven Sproat

import wx 

class CustomWidget(wx.PyControl): 
    def __init__(self, parent): 
    wx.PyControl.__init__(self, parent=parent, style=wx.NO_BORDER) # Style added. 
    text = wx.TextCtrl(parent=self) 
    spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL) 
    sizer = wx.GridBagSizer() 
    self.layout(text, spin, sizer) 
    self.OnInit(text, sizer) 

    def OnInit(self, text, sizer): 
    text.SetValue(u"0.000") 

    def layout(self, text, spin, sizer): 
    self.SetSizer(sizer) 
    sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER) 
    sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER) 
    self.Fit() 
    self.Layout() # This is what I lacked. I needed to call .Layout() 
    self.CenterOnParent() 

回答

3

是的,可以。你只需要調用Layout()來告訴sizer重新計算/佈局它的孩子。

import wx 

class Frame(wx.Frame): 
    def __init__(self): 
    wx.Frame.__init__(self, None) 
    blah = CustomWidget(self) 
    self.Show(True) 

class CustomWidget(wx.PyControl): 
    def __init__(self, parent): 
    wx.PyControl.__init__(self, parent=parent) 
    text = wx.TextCtrl(parent=self) 
    spin = wx.SpinButton(parent=self, style=wx.SP_VERTICAL) 
    sizer = wx.GridBagSizer() 
    self.layout(text, spin, sizer) 
    self.OnInit(text, sizer) 

    def OnInit(self, text, sizer): 
    text.SetValue(u"0.000") 

    def layout(self, text, spin, sizer): 
    self.SetSizer(sizer) 
    sizer.Add(text, pos=(0, 0), flag=wx.ALIGN_CENTER) 
    sizer.Add(spin, pos=(0, 1), flag=wx.ALIGN_CENTER) 
    self.Fit() 
    self.Layout() 
    self.CenterOnParent() 

app = wx.App() 
f = Frame() 
app.MainLoop() 

順便說一句,這將是未來很好,如果你可以附加一個可運行的樣品如上:)

+0

這很棒!並感謝關於可運行示例的社區小貼士。我下次會這樣做:)我也編輯了我的問題以包含您的解決方案。 – Kit 2010-07-18 01:14:19

+0

我對這個做了一些更多的實驗,但是我認爲當'CustomWidget'是'wx.Panel'的子元素而不是'wx.Frame'時,它會崩潰。你的想法? – Kit 2010-07-22 00:59:00

+0

你是否按照羅賓的建議嘗試? – 2010-07-22 10:26:19

1

因爲從wxControl派生類通常不用於含有其他部件的自動佈局代碼不存在,因此它在獲取EVT_SIZE事件時不會調用Layout()。您可以通過綁定()爲EVT_SIZE處理程序並從那裏調用self.Layout()來輕鬆地將該能力添加到您的類中。然後它就像一個面板在獲得大小事件時所做的一樣,並且具有子級和sizer。

相關問題