Как мне управлять окном просмотра сетки в wxPython?

Я пытаюсь реализовать функцию Find в своем сеточном приложении. Я могу переместить курсор, используя SetGridCursor(self, row, col), но я не могу понять, как переместить "окно просмотра" сетки в новую позицию курсора. Другими словами, когда курсор перемещается в ячейку, которую ищет пользователь, пользователю все равно приходится вручную прокручивать, пока он не найдет ячейку курсора.

Как программно прокрутить сетку, чтобы я мог центрировать курсор сетки в области просмотра?


Случайно, когда я писал этот вопрос, я зашел на вики-страницу Grid, искал слово "свиток" и обнаружил:

MakeCellVisible( int row, int col ) - заставляет определенную ячейку быть видимой, эффективно работает, чтобы прокрутить сетку, которая будет дана ячейке

Что почти решает мою проблему. Я хотел бы, чтобы ячейка была центрирована в окне просмотра, но эта функция прокручивается только до тех пор, пока ячейка не станет видимой на краю экрана. Я не могу найти какие-либо функции, которые влияют только на положение прокрутки сетки, не влияя также на положение курсора. Мысли?

2 ответа

В подобных ситуациях посмотрите, какие методы wxWidgets (основная библиотека C++). wxGrid подклассы wxScrolled, wxScrolled выставляет эти методы:

  • Scroll

    Прокручивает окно, поэтому начало просмотра находится в заданной точке.

  • GetVirtualSize

    Получает размер в единицах устройства прокручиваемой области окна (в отличие от размера клиента, который является видимой в данный момент областью окна).

Я думаю, что вы можете использовать эти методы для расчета координат центра прокручиваемого окна. Теперь, что вам нужно, это координаты ячейки, в которой вы бы хотели сосредоточиться. wxGrid выставляет этот метод:

  • CellToRect

    Вернуть прямоугольник, соответствующий размеру и положению ячейки сетки в логических координатах.

Теперь в C++ вы бы wxGrid к wxScrolled и вызвать методы, которые вы хотите. Тем не мение, wxPython не всегда раскрывает все методы, доступные в wxWidgets так вот где вам нужно немного креативить, используя несвязанные методы. Ниже приведен псевдокод, он не проверен, но должен дать вам представление о том, как это сделать.

grid = wx.Grid()

cell_coords = grid.CellToRect(12,12)

# get the virtual size by calling it as unbound method
virtual_size = wx.Scrolled.GetVirtualSize(grid)

# calculate the upper-left coordinate
scroll_coords = (cell_coords.x - virtual_size.width / 2,
                 cell_coords.y - virtual_size.height / 2)

# call Scroll as unbound method
wx.Scrolled.Scroll(grid, scroll_coords)

Это работает для меня для вертикальной прокрутки, чтобы держать курсор сетки в середине страницы:

def set_grid_cursor(grid, irow, icol):
    # move the cursor to the cell as usual
    grid.GoToCell(irow, icol)
    # scroll to keep irow in the middle of the page
    ppunit = grid.GetScrollPixelsPerUnit()
    cell_coords = grid.CellToRect(irow, icol)
    y = cell_coords.y / ppunit[1]  # convert pixels to scroll units
    scrollPageSize = grid.GetScrollPageSize(wx.VERTICAL)
    scroll_coords = (0, y - scrollPageSize / 2)
    grid.Scroll(scroll_coords)

Возможно, вам придется позвонить, используя wx.CallAfter(set_grid_cursor, grid, irow, icol) если вы только что обновили сетку.

Другие вопросы по тегам