2015-11-18 26 views
0

首先,我使用wxPython 2.8.12.1。wxPython ScrolledPanel不在對話框中調整大小

我正在嘗試創建一個設置對話框,用戶可以在其中查看並編輯某些設置。 Atm我在滾動面板中有設置,然後我希望將面板添加到我的對話框中,並在對話框底部的「保存」和「取消」按鈕。我可以隱約得到我需要的東西,但滾動的面板開始非常小(甚至不顯示一次完整的垂直行文本),並且不會與對話框一起調整大小。這裏是我的代碼看起來像:

import wx 
import wx.lib.scrolledpanel as scrolled 

class SettingsDialog(wx.Dialog):  
    def __init__(self): 
     """Initialize the dialog""" 
     wx.Dialog.__init__(self, None, wx.ID_ANY, 'Settings', size=(100,100), 
          style=wx.DEFAULT_DIALOG_STYLE|wx.RESIZE_BORDER) 
     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     # Add Settings Panel 
     self.panel = SettingsPanel(self) 
     self.mainSizer.Add(self.panel, 0, wx.EXPAND) 
     # Add Save/Cancel Buttons 
     self.createWidgets() 
     # Set sizer and window size 
     self.SetSizer(self.mainSizer) 
     self.mainSizer.Fit(self) 

    def createWidgets(self): 
     """Create and layout the widgets in the dialog""" 
     btnSizer = wx.StdDialogButtonSizer() 

     saveBtn = wx.Button(self, wx.ID_OK, label="Save") 
     saveBtn.Bind(wx.EVT_BUTTON, self.OnSave) 
     btnSizer.AddButton(saveBtn) 

     cancelBtn = wx.Button(self, wx.ID_CANCEL) 
     btnSizer.AddButton(cancelBtn) 
     btnSizer.Realize() 

     self.mainSizer.Add(btnSizer, 0, wx.ALL | wx.ALIGN_RIGHT, 5) 

    def OnSave(self, event): 
     pass 

class SettingsPanel(scrolled.ScrolledPanel): 
    def __init__(self, parent): 
     scrolled.ScrolledPanel.__init__(self, parent, -1) 
     self.mainSizer = wx.BoxSizer(wx.VERTICAL) 
     self.createWidgets() 
     self.SetSizer(self.mainSizer) 
     self.mainSizer.Fit(self) 
     self.SetupScrolling() 

    def createWidgets(self): 
     """Create and layout the widgets in the panel""" 
     settingsSizer = wx.GridSizer(rows=0, cols=2, hgap=5, vgap=0) 

     names = #List of names grabbed from elsewhere 
     values = #List of values grabbed from elsewhere 
     name_value_dict = zip(names, values) 

     for name, value in name_value_dict: 
      lbl = wx.StaticText(self, label=''.join([name,':'])) 
      settingsSizer.Add(lbl, 0, wx.ALL, 5) 
      txt = wx.TextCtrl(self, value=value, name="Name") 
      settingsSizer.Add(txt, 0, wx.ALL|wx.EXPAND, 5) 

     self.mainSizer.Add(settingsSizer, 0, wx.EXPAND) 

class MyApp(wx.App): 
    def OnInit(self): 
     dlg = SettingsDialog() 
     dlg.ShowModal() 
     dlg.Destroy() 
     return True 

if __name__ == '__main__': 
    app = MyApp(False) 
    app.MainLoop() 

任何幫助一如既往的讚賞。

回答

0

我用wxPython 3.0版修復了你的代碼,它看起來就像你想的那樣。它也將與2.8版一起工作。讓我解釋你應該做什麼。

  1. 使對話框的大小變大。僅顯示所有小部件是不夠的。 wx.Dialog.__init__(self, None, wx.ID_ANY, 'Settings', size=(300, 300), ...
  2. 添加size參數爲您ScrolledPanel這樣scrolled.ScrolledPanel.__init__(self, parent, -1, size=(200, 200))

這就是全部。希望這可以幫助。

+0

好的,謝謝。我還沒有仔細觀察,但我並不擔心在初始化時設置大小。我希望sizer.Fit(父母)會照顧這一點。 – Shatnerz

+0

所以看起來像設置大小是主要問題。如果設置更改大小,是否有一種簡單的方法來自動執行此操作?這是甚至是好的做法,還是有更好的默認大小看起來好嗎?與之前一樣,我希望面板能夠包含所有的小部件,然後該對話框將適合包含面板和按鈕。 – Shatnerz

+0

有一些方法,這篇文章討論它http://stackoverflow.com/q/12607460/5303401 – ozy