创建后调整wx.ListCtrl的大小

时间:2013-06-11 10:55:17

标签: python wxpython

所以我创建了一个listctrl并添加到sizer中。

import wx
class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None)

        panel1=wx.Panel(self)
        self.mainSizer=wx.BoxSizer(wx.VERTICAL)
        panel1.SetSizer(self.mainSizer)
        self.button1=wx.Button(panel1, label='xxx')
        self.list1=wx.ListCtrl(panel1, size=(300,-1), style=wx.LC_REPORT|wx.LC_VRULES)
        self.mainSizer.Add(self.button1, 0, wx.CENTER)
        self.mainSizer.Add(self.list1, 1, wx.ALL|wx.CENTER, 20)
        self.button1.Bind(wx.EVT_BUTTON, self.onButton)

    def onButton(self, pliki):
        self.list1.InsertColumn(0, 'col1')
        self.list1.InsertColumn(1, 'col2')
        self.list1.InsertColumn(2, 'col3')

        self.list1.SetColumnWidth(0, 150)
        self.list1.SetColumnWidth(1, 150)

        self.list1.SetSize( ( sum([self.list1.GetColumnWidth(i) for i in (0,1,2)])   , -1) )

x=wx.App()
y=myFrame().Show()
x.MainLoop()

然后按下按钮时,数据会传播到列表,然后我想更改列的大小(根据插入的数据计算)。但是当我调整窗口大小时 - 列表的大小将返回到previous(在创建时声明)。我怎么能避免它?

1 个答案:

答案 0 :(得分:2)

使用SetMinSize告诉使用列表的sizer不要低于给定的大小。 我还调用了PostSizeEventToParent,因此该列表的sizer以新的大小重新定位。

import wx


class myFrame(wx.Frame):
    def __init__(self):
        wx.Frame.__init__(self, parent=None)

        panel1 = wx.Panel(self)
        self.mainSizer = wx.BoxSizer(wx.VERTICAL)
        panel1.SetSizer(self.mainSizer)
        self.button1 = wx.Button(panel1, label='xxx')
        self.list1 = wx.ListCtrl(panel1, size=(300, -1),
                                 style=wx.LC_REPORT | wx.LC_VRULES)
        self.mainSizer.Add(self.button1, 0, wx.CENTER)
        self.mainSizer.Add(self.list1, 1, wx.ALL | wx.CENTER, 20)
        self.button1.Bind(wx.EVT_BUTTON, self.onButton)

    def onButton(self, pliki):
        self.list1.InsertColumn(0, 'col1')
        self.list1.InsertColumn(1, 'col2')
        self.list1.InsertColumn(2, 'col3')
        self.sizeColumns()

    def sizeColumns(self):
        self.list1.SetColumnWidth(0, 150)
        self.list1.SetColumnWidth(1, 150)
        size = (sum([self.list1.GetColumnWidth(i) for i in (0, 1, 2)]), -1)
        self.list1.SetSize(size)
        self.list1.SetMinSize(size)
        self.list1.PostSizeEventToParent()

x = wx.App()
y = myFrame().Show()
x.MainLoop()

P.S。您实际上可以删除原始的SetSize调用