Как мне прокрутить wxPython wx.html.HtmlWindow обратно туда, где он был, когда пользователь щелкнул ссылку?

StackOverflow https://stackoverflow.com/questions/1400179

  •  05-07-2019
  •  | 
  •  

Вопрос

Я использую 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, и если да, то сохранить что-то вроде номера строки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top