SSCCE位于底部
我的布局在wx.ListBox
中并排有两个wx.FlexGridSizer
es:
我的真实布局比较复杂,因此就是FGS,但这个小例子仍然存在问题。
正如您在上面所看到的,我已成功使用style = wx.LB_HSCROLL
使每个列表框使用水平滚动条,当其中一个元素太大而无法放入wx.Frame
时。
然而,当我调整窗口的大小越来越小时,最终达到了一些关键点,第一个列表框决定它不再需要使用它的滚动条,而是扩展到它的完整大小,将第二个框推到右:
列表疯狂的点取决于字符串的长度。如果我在第一个框中放了足够长的字符串,那么上面的过程就会颠倒过来:布局错误开始我必须将窗口向上调整到临界点,突然之间listbox开始使用它的滚动条,变得更小,并且窗口在中间分割成应有的位置。
我不确定这是否是wxWidgets / wxPython中的错误,或者我做错了什么,但无论哪种方式都令人沮丧。这是我能提出的最简单的代码,它显示了问题:
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent = None, size = (640, 480))
self.list1 = wx.ListBox(self, style = wx.LB_HSCROLL)
self.list2 = wx.ListBox(self, style = wx.LB_HSCROLL)
self.list1.Append('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
self.list2.Append('bbbbbbbbbbb')
self.fgs = wx.FlexGridSizer(1, 2)
self.fgs.AddMany([(self.list1, 1, wx.EXPAND), (self.list2, 1, wx.EXPAND)])
self.fgs.AddGrowableRow(0, 1)
self.fgs.AddGrowableCol(0, 1)
self.fgs.AddGrowableCol(1, 1)
self.Bind(wx.EVT_SIZE, self.OnSize)
self.Sizer = fgs
self.Layout()
self.Show()
def Exit(self, event):
self.Close(True)
app = wx.App(False)
frame = MyFrame()
app.MainLoop()
编辑:这是我在python中实现ravenspoint的代码(上面的代码略有改动以支持这个):
def OnSize(self, event):
if not self.list1 or not self.list2;
return
clientRect = self.GetClientRect()
min = wx.Size(clientRect.width / 2, clientRect.height)
self.list1.MinSize = min
self.list2.MinSize = min
答案 0 :(得分:1)
您可能需要自己处理调整大小事件。在C ++中,处理程序看起来像这样:
void MyFrame::OnSize(wxSizeEvent& )
{
if( ! ( list1 && list2 ) )
return;
wxRect frame_client = GetClientRect();
wxSize min(frame_client.width/2,frame_client.height );
list1->SetMinSize(min);
list2->SetMinSize(min);
fgs->Layout();
}
答案 1 :(得分:1)
由于我也遇到了这个问题,我将发布此信息以供将来参考。至少对于wxPython,你必须指定一个最小尺寸,或者它将使用最佳尺寸(至少对于列表框),并且sizer可能会将小部件推到当前窗口框之外。因此,使上述代码按需运行的附加代码是:
self.list1.SetMinSize((10,10));
self.list2.SetMinSize((10,10));
总的工作答案是:
import wx
class MyFrame(wx.Frame):
def __init__(self):
wx.Frame.__init__(self, parent = None, size = (640, 480))
self.list1 = wx.ListBox(self, style = wx.LB_HSCROLL)
self.list2 = wx.ListBox(self, style = wx.LB_HSCROLL)
self.list1.Append('aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa')
self.list2.Append('bbbbbbbbbbb')
self.fgs = wx.FlexGridSizer(1, 2)
self.fgs.AddMany([(self.list1, 1, wx.EXPAND), (self.list2, 1, wx.EXPAND)])
self.fgs.AddGrowableRow(0, 1)
self.fgs.AddGrowableCol(0, 1)
self.fgs.AddGrowableCol(1, 1)
# Don't forget these two lines to allow for correct
# expansion/contraction of the sizer!
self.list1.SetMinSize((10,10));
self.list2.SetMinSize((10,10));
self.Sizer = self.fgs
self.Layout()
self.Show()
if __name__ == "__main__":
app = wx.App(False)
frame = MyFrame()
app.MainLoop()