2011-10-17 4 views
1

私はこれをしばらくお待ちしており、それを理解できないようです。 self.panel = wx.Panel(self、wx.ID_ANY)パネル内のスクロールパネルがサイジングされていません

スクロールしないパネル内にスクロールパネルがあります。

self.panel = wx.Panel(self, wx.ID_ANY) 
self.stepPanel = wxscrollpanel.ScrolledPanel(self.panel, -1, style=wx.EXPAND) 
self.stepPanel.SetupScrolling(scrollToTop=False) 

sizer = wx.BoxSizer(wx.VERTICAL) 
self.stepPanel.SetSizerAndFit(sizer) 

アップデート機能はこのように書きます...

sizer = self.stepPanel.GetSizer() 
# Add some widgets 
self.stepPanel.SetSizerAndFit(sizer) 

私は、ユーザーがボタンをクリックすると...私は、自動レイアウトを試した上で、後サイザーにウィジェットを追加し、FitInside()、 Update()...ウィジェットを追加すると、このstepPanelをスクロールできないようです。

編集:ここでの考え方は、下部にスクロールしながら、self.panelがスクロールしない上部の面積(ちょうど別のパネルを)持っているということです...

をより多くの情報を追加する(self.stepPanel )、stepPanelはself.panelの可視領域から大きくなっているようです。

EDIT:解説を参照してください。

+0

:SizerAndFitが問題だった、私はフィットを削除し、すべてが素晴らしく動作します。 – lostdev

答えて

2

私はそれを理解したと思います。いつものように、ウィジェットを追加または削除するときは、親のLayoutを呼び出す必要があります。この場合、スクロールしたパネルは新しい子を取得しています。どのくらいのスペースがあるか、スクロールバーが必要かどうかを再計算できるように、SetupScrolling()を呼び出す必要があります。ここでは、Windows上で私の作品例です:

解決
import wx 
import wx.lib.scrolledpanel as scrolled 

######################################################################## 
class MyForm(wx.Frame): 

    #---------------------------------------------------------------------- 
    def __init__(self): 
     wx.Frame.__init__(self, None, wx.ID_ANY, "Tutorial", size=(200,500)) 

     # Add a panel so it looks the correct on all platforms 
     self.panel = wx.Panel(self, wx.ID_ANY) 

     # -------------------- 
     # Scrolled panel stuff 
     self.scrolled_panel = scrolled.ScrolledPanel(self.panel, -1, 
           style = wx.TAB_TRAVERSAL|wx.SUNKEN_BORDER, name="panel1") 
     self.scrolled_panel.SetAutoLayout(1) 
     self.scrolled_panel.SetupScrolling() 

     words = "A Quick Brown Insane Fox Jumped Over the Fence and Ziplined to Cover".split() 
     self.spSizer = wx.BoxSizer(wx.VERTICAL) 
     for word in words: 
      text = wx.TextCtrl(self.scrolled_panel, value=word) 
      self.spSizer.Add(text) 
     self.scrolled_panel.SetSizer(self.spSizer) 
     # -------------------- 

     btn = wx.Button(self.panel, label="Add Widget") 
     btn.Bind(wx.EVT_BUTTON, self.onAdd) 

     panelSizer = wx.BoxSizer(wx.VERTICAL) 
     panelSizer.AddSpacer(50) 
     panelSizer.Add(self.scrolled_panel, 1, wx.EXPAND) 
     panelSizer.Add(btn) 
     self.panel.SetSizer(panelSizer) 

    #---------------------------------------------------------------------- 
    def onAdd(self, event): 
     """""" 
     print "in onAdd" 
     new_text = wx.TextCtrl(self.scrolled_panel, value="New Text") 
     self.spSizer.Add(new_text) 
     self.scrolled_panel.Layout() 
     self.scrolled_panel.SetupScrolling() 

# Run the program 
if __name__ == "__main__": 
    app = wx.App(False) 
    frame = MyForm().Show() 
    app.MainLoop() 
+0

ウィジェットを追加した後に 'SetupScrolling'をもう一度呼び出す必要があるとは思いませんでした。 (私の経験はWindowsとMacOSでの経験と同じでしたが、Linux上で追加のステップを経なければ私にとってうまくいきました) – starfry

+0

うん。 GUIの作業は、通常、あなたが望むように動作させるために少しの試行錯誤を経ることになります。 –

関連する問題