当其包含的面板或框架变得太小时,wxListBox将停止使用其水平滚动条并展开以占用太多空间

时间:2012-01-11 01:20:02

标签: python wxpython wxwidgets

SSCCE位于底部

我的布局在wx.ListBox中并排有两个wx.FlexGridSizer es:

OK so far

我的真实布局比较复杂,因此就是FGS,但这个小例子仍然存在问题。

正如您在上面所看到的,我已成功使用style = wx.LB_HSCROLL使每个列表框使用水平滚动条,当其中一个元素太大而无法放入wx.Frame时。

然而,当我调整窗口的大小越来越小时,最终达到了一些关键点,第一个列表框决定它不再需要使用它的滚动条,而是扩展到它的完整大小,将第二个框推到右:

Window gets too small!

列表疯狂的点取决于字符串的长度。如果我在第一个框中放了足够长的字符串,那么上面的过程就会颠倒过来:布局错误开始我必须将窗口向上调整到临界点,突然之间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

2 个答案:

答案 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()