#python #user-interface #wxpython
#python #пользовательский интерфейс #wxpython
Вопрос:
Я хочу ограничить размер окна управления списком. Давайте возьмем следующий код:
import wx
class Students(wx.Frame):
def __init__(self, parent, id, title):
wx.Frame.__init__(self, parent, id, title, size=(380, 230))
hbox = wx.BoxSizer(wx.HORIZONTAL)
panel = wx.Panel(self, -1)
self.list = wx.ListCtrl(panel, -1, style=wx.LC_REPORT)
self.list.InsertColumn(0, 'name')
self.list.InsertColumn(1, 'age')
hbox.Add(self.list, 1,wx.EXPAND)
panel.SetSizer(hbox)
self.Centre()
self.Show(True)
app = wx.App()
Students(None, -1, 'studs')
app.MainLoop()
Если я сделаю пропорцию размера горизонтального прямоугольника равной 0, вот так:
hbox.Add(self.list, 0,wx.EXPAND)
тогда возникает другая проблема. Проблема с proportion = 1 заключается в том, что после столбца ‘Age’ остается много пустого места, которое окно управления списком занимает для третьего столбца, которого не существует.
Проблема с proportion = 0 заключается в том, что он слишком мал по ширине.
Я хочу отобразить окно управления списком только со столбцами ‘Name’ и ‘Age’ и сохранить остальное пространство. Как мне это сделать?
Ответ №1:
Вы можете установить ширину вашего элемента управления списком вручную, а затем установить пропорцию равной 0.
Ширину столбцов можно задать вручную:
import wx
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour(wx.GREEN)
self.list = wx.ListCtrl(self, style=wx.LC_REPORT, size=(200, -1))
column_size = self.list.GetSize()[0] / 2 - 2
self.list.InsertColumn(0, 'Name')
self.list.InsertColumn(1, 'Age')
self.list.SetColumnWidth(0, column_size)
self.list.SetColumnWidth(1, column_size)
self.sizer = wx.BoxSizer()
self.sizer.Add(self.list, proportion=0, flag=wx.EXPAND)
self.sizer.Add(self.panel, proportion=1, flag=wx.EXPAND)
self.SetSizerAndFit(self.sizer)
self.SetSize((600, 400))
self.Show()
app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
Или может использоваться ListCtrlAutoWidthMixin:
import wx
import wx.lib.mixins.listctrl as listmix
class TestListCtrl(wx.ListCtrl, listmix.ListCtrlAutoWidthMixin):
def __init__(self, *args, **kwargs):
wx.ListCtrl.__init__(self, *args, **kwargs)
listmix.ListCtrlAutoWidthMixin.__init__(self)
class MainWindow(wx.Frame):
def __init__(self, *args, **kwargs):
wx.Frame.__init__(self, *args, **kwargs)
self.panel = wx.Panel(self)
self.panel.SetBackgroundColour(wx.GREEN)
self.list = TestListCtrl(self, style=wx.LC_REPORT, size=(200, -1))
self.list.InsertColumn(0, 'Name')
self.list.InsertColumn(1, 'Age')
self.sizer = wx.BoxSizer()
self.sizer.Add(self.list, proportion=0, flag=wx.EXPAND)
self.sizer.Add(self.panel, proportion=1, flag=wx.EXPAND)
self.SetSizerAndFit(self.sizer)
self.SetSize((600, 400))
self.Show()
app = wx.App(False)
win = MainWindow(None)
app.MainLoop()
Ответ №2:
Не используйте wx.EXPAND, если вы не хотите изменять размер элемента управления. Вы также могли бы поместить разделитель в горизонтальный размер сразу после элемента управления списком и вместо этого заставить его расширяться. Тогда разделитель займет все доступное пространство.