Как ограничить растяжение столбца в таблице wxpython

Рейтинг: 0Ответов: 1Опубликовано: 25.06.2023

У меня есть такая таблица:

# Создаем таблицу
grid = wx.grid.Grid(panel)

grid.CreateGrid(0, 2)  # 5 строк, 2 столбца
grid.SetColLabelValue(0, "IP")
grid.SetColLabelValue(1, "BANNER")
grid.AutoSizeColumns()

введите сюда описание изображения

Мне необходимо сделать так что бы пользователь не мог растягивать столбцы по ширине бесконечно как тут: введите сюда описание изображения

Как мне это сделать?

Ответы

▲ 1Принят

Растяжение размера столбца ограничено шириной экрана. Я нашел, вроде, где этот размер находиться в событии

EVT_GRID_CMD_COL_SIZE: Пользователь изменил размер столбца в соответствии с wxEVT_GRID_COL_SIZE типом события,

с помощью event.EventObject.ClassInfo.Size, но как изменить его или как поймать это событие в динамике, я не нашел. Поэтому просто возвращаю размер сильно растянутого столбца к нужному.

import wx
import wx.grid


class MyForm(wx.Frame):

    def __init__(self):
        wx.Frame.__init__(self, parent=None, title="A Simple grid")

        self.panel = wx.Panel(self)

        self.grid = wx.grid.Grid(self.panel)
        self.grid.CreateGrid(5, 2)
        self.grid.SetColLabelValue(0, "IP")
        self.grid.SetColLabelValue(1, "BANNER")
        self.grid.AutoSizeColumns()

        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.sizer.Add(self.grid, 1, wx.EXPAND)
        self.panel.SetSizer(self.sizer)
        # Ловим событие пользователь изменил размер столбца
        self.grid.Bind(wx.grid.EVT_GRID_CMD_COL_SIZE, self.col_size)

    def col_size(self, event):
        print(event.EventObject.ClassInfo.Size)
        # Определяем в каком столбце произошло событие.
        col = event.RowOrCol
        # Находим ширину  таблицы.
        width_grid = self.grid.GetSize()[0]
        # Возвращаем размер столбца до необходимого размера, я взял половину ширины таблицы.
        self.grid.SetColSize(col, min(width_grid // 2, self.grid.GetColSize(col)))
        # Возвращаем ячейку в видимую часть окна.
        self.grid.MakeCellVisible(0, col)
        event.Skip()


if __name__ == "__main__":
    app = wx.App()
    frame = MyForm().Show()
    app.MainLoop()