如何让wxPython wx.html.HtmlWindow在用户点击链接时滚动回之前的位置?

2 投票
4 回答
1269 浏览
提问于 2025-04-15 14:11

我正在使用wxPython中的wx.html.HtmlWindow来显示我的界面的一部分。用户可以在一个比列表小的窗口中向下滚动链接列表。当他们点击一个链接时,我需要重新绘制网页,但我希望能把页面的位置恢复到他们点击的地方。

我试过在事件上使用MouseEvent.GetLogicalPosition(),但是它需要一个DC(设备上下文),而我得到的信息和GetPosition()一样,所以我可能没有给它正确的参数。

我也尝试过HtmlWindow.CalcScrolledPosition(),但显然在HtmlWindow中这个方法不可用,因为我遇到了NotImplementedError(未实现错误)...

我希望能从MouseEvent或者OnLinkClicked的信息中得到一个滚动位置。

我知道HtmlWindow.ScrollToAnchor()这个方法,但它不太稳定,看起来也不好。如果可以的话,我更希望能绕过这个方法,这样我就能精确地滚动回用户点击的地方。

谢谢!

4 个回答

1

我正在做的事情是让页面滚动回之前的位置。这样做是为了避免页面闪烁。

        pos = self.GetViewStart()[1]
        self.Freeze()
        self.SetPage(src)
        if save_scroll_pos:
            self.Scroll(0, pos)
        self.Thaw()
1

可能有点晚了,不过根据ax的一些建议,还有这里的一些提示,我觉得可以这样做:

scrollpos = wx.html.HtmlWindow.GetViewStart()[1]

把这个结果存起来,然后稍后再调用:

wx.html.HtmlWindow.Scroll(0, scrollpos)

对我来说,这样是有效的。当然,你需要把wx.html.HtmlWindow换成你实际使用的实例的引用。

2

不妨看看这个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();

用来返回到之前保存的位置。

我认为这个内置的“返回到窗口最后位置”的功能应该不会太“脆弱和不美观”。你觉得类似的功能也能在你这里实现吗?

撰写回答