Фильтрация данных в ListCrtl wxPython
Я написал небольшой графический интерфейс на wxPython для программы обработки данных. Она записывает данные из БД в таблицу, затем их нужно отсортировать. Сначала я хотел добавить на панель сверху над каждым столбцом таблицы поле для ввода текста (чтобы задавать диапазоны фильтра) и чекбокс (чтобы активировать фильтр). Но при такой реализации колонки таблицы могут уходить вправо (пользователь может их расширять в зависимости от размера экрана и поступивших данных) и тогда фильтры будут располагаться не над своими колонками. Возможно ли с помощью wxPython добавить поля для фильтрации (тестовое и чекбокс) прямо в саму таблицу, над названием колонки, чтобы при расширении они двигались вместе?
import wx
import wx.lib.mixins.listctrl
class ListCtrlMixin(wx.ListCtrl, wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin, wx.lib.mixins.listctrl.ColumnSorterMixin):
def __init__(self, parent, *args, **kw):
wx.ListCtrl.__init__(self, parent, wx.ID_ANY, style=wx.LC_REPORT)
wx.lib.mixins.listctrl.ListCtrlAutoWidthMixin.__init__(self)
wx.lib.mixins.listctrl.ColumnSorterMixin.__init__(self, 10)
self.itemDataMap = log_entries_list
def GetListCtrl(self):
return self
class MyFrame(wx.Frame):
def __init__(self, parent, title, size):
super().__init__(parent, title=title, size=size)
self.panel = wx.Panel(self)
# конфигурация сайзера панели инструментов
toolbar_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.start_read_button = wx.Button(self.panel, label="Считать", size=(70, 30))
self.Bind(wx.EVT_BUTTON, self.start_read, id=self.start_read_button.GetId())
self.downdload_file_button = wx.Button(self.panel, label="Загрузить в файл", size=(150, 30))
self.Bind(wx.EVT_BUTTON, self.download_file, id=self.downdload_file_button.GetId())
toolbar_sizer.Add(self.start_read_button, 0, border=10)
toolbar_sizer.Add(self.downdload_file_button, 0, border=10)
# конфигурация сайзера таблицы
table_sizer = wx.BoxSizer(wx.HORIZONTAL)
self.table = ListCtrlMixin(self.panel)
self.table.InsertColumn(0, '№', wx.LIST_FORMAT_RIGHT, width=50)
self.table.InsertColumn(1, 'Дата', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(2, 'Время', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(3, 'БКУ', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(4, 'КЛ', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(5, 'АУ', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(6, 'Канал', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(7, 'Код события', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(8, 'Доп. параметр', wx.LIST_FORMAT_CENTER, width=120)
self.table.InsertColumn(9, 'Описание', wx.LIST_FORMAT_CENTER, width=120)
table_sizer.Add(self.table, flag = wx.ALL | wx.EXPAND, proportion=1)
main_window_sizer.Add(toolbar_sizer, flag=wx.ALL, border=10)
main_window_sizer.Add(table_sizer, proportion=1, flag=wx.EXPAND | wx.ALL, border=5)
Так выглядит GUI:
