Как мне прокрутить wxPython wx.html.HtmlWindow обратно туда, где он был, когда пользователь щелкнул ссылку?
Вопрос
Я использую wxPython wx.html.HtmlWindow для отображения части моего интерфейса.Пользователь может прокручивать список ссылок в окне меньшем, чем сам список.Когда они нажимают на ссылку, мне нужно перерисовать веб-страницу, но я хочу вернуть положение страницы туда, где они нажали на нее.
Я попробовал MouseEvent.GetLogicalPosition() для этого события, но ему нужен DC, и лучшее, что я смог сделать, это получить ту же информацию, что и GetPosition(), поэтому я не должен передавать ему правильную информацию.
Я также попробовал HtmlWindow.CalcScrolledPosition(), но, видимо, он недоступен в HtmlWindow, потому что я получаю NotImplementedError...
Мне бы хотелось, чтобы позиция прокрутки могла быть получена из информации MouseEvent или OnLinkClicked.
Я знаю о HtmlWindow.ScrollToAnchor(), но он ненадежен и неэстетичен - я бы предпочел обойти его, если это возможно, чтобы иметь возможность прокручивать назад точно туда, где пользователь щелкнул.
Спасибо!
Решение
как насчет того, чтобы взглянуть на источник wxHtmlWindow для вдохновения?например в wxHtmlWindow::LoadPage()
:это
// store[s the current] scroll position into history item:
int x, y;
GetViewStart(&x, &y);
(*m_History)[m_HistoryPos].SetPos(y);
эта сохраненная позиция прокрутки используется в wxHtmlWindow::HistoryBack()
:
Scroll(0, (*m_History)[m_HistoryPos].GetPos());
Refresh();
чтобы вернуться в сохраненную позицию.
Я бы предположил, что эта встроенная обработка «перейти к последней позиции в окне» не самая «ненадежная и неэстетичная».может ли что-то подобное подойти и вам?
Другие советы
Возможно, немного поздно, но с некоторыми советами от Топора и подсказками от здесь, я думаю, что вызов:
scrollpos = wx.html.HtmlWindow.GetViewStart()[1]
и сохранить это, а затем выполнить вызов:
wx.html.HtmlWindow.Scroll(0, scrollpos)
работает для меня.Конечно, вам нужно изменить wx.html.HtmlWindow на реальную ссылку на экземпляр.
Вот что я делаю, чтобы прокрутить страницу до предыдущей позиции.Я делаю это, чтобы не моргать.
pos = self.GetViewStart()[1]
self.Freeze()
self.SetPage(src)
if save_scroll_pos:
self.Scroll(0, pos)
self.Thaw()
Обычно события щелчка инициируются событиями MouseUp.Если вы отслеживаете положение мыши, фиксируя любые события MouseDown, вы будете знать, где произошел последний щелчок (MouseUp), и это должно позволить вам восстановить ситуацию.
Для решения этой конкретной проблемы вам, возможно, придется проделать немного больше работы в MouseDown, например проверить, находятся ли они внутри элемента управления wxHtmlWindow, и если да, то сохранить что-то вроде номера строки.