Как мне управлять окном просмотра сетки в wxPython?
Я пытаюсь реализовать функцию Find в своем сеточном приложении. Я могу переместить курсор, используя SetGridCursor(self, row, col)
, но я не могу понять, как переместить "окно просмотра" сетки в новую позицию курсора. Другими словами, когда курсор перемещается в ячейку, которую ищет пользователь, пользователю все равно приходится вручную прокручивать, пока он не найдет ячейку курсора.
Как программно прокрутить сетку, чтобы я мог центрировать курсор сетки в области просмотра?
Случайно, когда я писал этот вопрос, я зашел на вики-страницу Grid, искал слово "свиток" и обнаружил:
MakeCellVisible( int row, int col )
- заставляет определенную ячейку быть видимой, эффективно работает, чтобы прокрутить сетку, которая будет дана ячейке
Что почти решает мою проблему. Я хотел бы, чтобы ячейка была центрирована в окне просмотра, но эта функция прокручивается только до тех пор, пока ячейка не станет видимой на краю экрана. Я не могу найти какие-либо функции, которые влияют только на положение прокрутки сетки, не влияя также на положение курсора. Мысли?
2 ответа
В подобных ситуациях посмотрите, какие методы wxWidgets
(основная библиотека C++). wxGrid
подклассы wxScrolled
, wxScrolled
выставляет эти методы:
Scroll
Прокручивает окно, поэтому начало просмотра находится в заданной точке.
GetVirtualSize
Получает размер в единицах устройства прокручиваемой области окна (в отличие от размера клиента, который является видимой в данный момент областью окна).
Я думаю, что вы можете использовать эти методы для расчета координат центра прокручиваемого окна. Теперь, что вам нужно, это координаты ячейки, в которой вы бы хотели сосредоточиться. wxGrid
выставляет этот метод:
CellToRect
Вернуть прямоугольник, соответствующий размеру и положению ячейки сетки в логических координатах.
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)
если вы только что обновили сетку.