2012-09-26 19 views
3

的wxPython 2.8.11.0,蟒蛇2.7wxPython的框架的最小尺寸與面板

如果我把一些Sizer一些控件直接進入Frame

import wx 

app=wx.App() 

frm = wx.Frame(None, title='title') 

sizer = wx.BoxSizer(wx.HORIZONTAL) 
sizer.Add(wx.SpinCtrl(frm)) 
sizer.Add(wx.SpinCtrl(frm)) 

frm.SetSizerAndFit(sizer) 
frm.Show() 

app.MainLoop() 

Frame將自動地有一個正確的最低大小包含Sizer,並且它不可能變小。 如果中間有一個Panel(根據需要在控件之間切換),這不起作用,窗口可能會變得太小。

import wx 

app=wx.App() 

frm = wx.Frame(None, title='title') 
pan = wx.Panel(frm) 

sizer = wx.BoxSizer(wx.HORIZONTAL) 
sizer.Add(wx.SpinCtrl(pan)) 
sizer.Add(wx.SpinCtrl(pan)) 

pan.SetSizerAndFit(sizer) 
frm.Show() 

app.MainLoop() 

此外frm.Fit()frm.SetMinSize(frm.GetEffectiveMinSize())需要獲得相同的行爲。全碼:

import wx 

app=wx.App() 

frm = wx.Frame(None, title='title') 
pan = wx.Panel(frm) 

sizer = wx.BoxSizer(wx.HORIZONTAL) 
sizer.Add(wx.SpinCtrl(pan)) 
sizer.Add(wx.SpinCtrl(pan)) 

pan.SetSizerAndFit(sizer) 
frm.Fit() 
frm.SetMinSize(frm.GetEffectiveMinSize()) 
frm.Show() 

app.MainLoop() 

我沒關係與frm.Fit(),但我不喜歡frm.SetMinSize(frm.GetEffectiveMinSize())。是不是有更好的解決方案,以便Frame自動考慮Panel的最小尺寸,就像之前的Sizer一樣?我認爲如果EffectiveMinSize在另一個控件添加到sizer後發生了改變,會發生什麼情況。

編輯: 顯然

panel.SetSizerAndFit(sizer) 
frm.Fit() 
frm.SetMinSize(frm.GetEffectiveMinSize()) 

panel.SetSizer(sizer) 
sizer.SetSizeHints(frm) 

這看起來有點清潔劑來代替。所以總的來看,這看起來像

import wx 

app=wx.App() 

frm = wx.Frame(None, title='title') 
pan = wx.Panel(frm) 

sizer = wx.BoxSizer(wx.HORIZONTAL) 
sizer.Add(wx.SpinCtrl(pan)) 
sizer.Add(wx.SpinCtrl(pan)) 

pan.SetSizer(sizer) 
sizer.SetSizeHints(frm) 
frm.Show() 

app.MainLoop() 

這是這樣做的首選方法?

如果部件稍後添加,即使第一種方法Sizer直接在Frame上也沒有干預就沒有正確,所以我認爲這是完全不同的問題。

+0

如果您使用的是wxpython> = 3,則首選'wx.Frame.SetMinSize'。 –

回答

3

最優雅的方式(恕我直言)在菲尼亞斯的答案給出。有一個額外的不必要的大小,但是我不認爲它真的可以引人注目。

有些人確實手動調用了SetSizeHints(),就像在你上一個例子中一樣,這樣也可以更加清晰(每當我使用額外的sizer時,我都覺得需要留下評論來解釋爲什麼它不應該被刪除)。

不幸的是沒有更好的方法,我不確定我們是否可以添加一個,因爲您需要對所有面板,尺寸和框架進行操作,這意味着您無法使用單一方法調用而不傳遞無關的參數給它。即我們可以有類似的東西

panel.SetSizerAndFitParent(sizer, frame); 

但它不是很清楚這是否會更好。

+0

感謝您評論@VZ,正如我在其他評論中所說的@phineas解決方案與一個額外的'Sizer'工程。我發現添加另一個對象在一些不太優雅之處,而不是一個額外的方法調用'SetSizeHints()',所以我想我會堅持'SetSizeHints()'。 – Sunday

0

引入管理幀內容的sizer(例如面板)怎麼樣?既然你沒有包括一個最小的例子,我還沒有測試過。

frameSizer = wx.BoxSizer(wx.VERTICAL) 
frameSizer.Add(panel) 
frm.SetSizerAndFit(frameSizer) 
+0

你好@phineas, 我已經添加了最小的例子給我的問題。我也嘗試過你的解決方案,它就像調用'SetSizeHints()'一樣工作,但是我發現有這個額外的'Sizer'有點不雅觀。 – Sunday

+0

很好的努力。你是對的,如果你要添加多個面板,額外的sizer會更有意義。 – phineas