Comment faire défiler un wxPython avec wx.html.HtmlWindow jusqu'à l'endroit où il se trouvait lorsque l'utilisateur a cliqué sur un lien?

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

  •  05-07-2019
  •  | 
  •  

Question

J'utilise wxPython wx.html.HtmlWindow pour afficher une partie de mon interface. L'utilisateur peut faire défiler une liste de liens dans une fenêtre plus petite que la liste. Quand ils cliquent sur un lien, je dois repeindre la page Web, mais je veux rétablir la position de la page à l'endroit où ils ont cliqué.

J'ai essayé MouseEvent.GetLogicalPosition () sur l'événement, mais il souhaite un contrôleur de domaine et le mieux que j'ai pu obtenir est d'obtenir les mêmes informations que GetPosition (); je ne dois donc pas le nourrir correctement. un.

J'ai aussi essayé HtmlWindow.CalcScrolledPosition (), mais apparemment, ce n'est pas disponible dans HtmlWindow car j'ai une erreur NotImplementedError ...

Ce que j'aimerais, c'est une position de défilement pouvant être dérivée de MouseEvent ou des informations OnLinkClicked.

Je connais HtmlWindow.ScrollToAnchor (), mais c'est flou et inesthétique - je préférerais le contourner si possible pour pouvoir revenir exactement à l'endroit où l'utilisateur a cliqué.

Merci!

Était-ce utile?

La solution

pourquoi ne pas jeter un oeil sur source de wxHtmlWindow pour vous inspirer? par exemple, à l'adresse wxHtmlWindow :: LoadPage () : it

// store[s the current] scroll position into history item:
int x, y;
GetViewStart(&x, &y);
(*m_History)[m_HistoryPos].SetPos(y);

cette position de défilement enregistrée est utilisée dans wxHtmlWindow :: HistoryBack () :

Scroll(0, (*m_History)[m_HistoryPos].GetPos());
Refresh();

pour revenir à la position enregistrée.

Je supposerais que cette fonction intégrée "Aller au dernier emplacement dans la fenêtre" la manipulation n'est pas le plus "feuilleté et inesthétique". Quelque chose de similaire pourrait-il fonctionner pour vous aussi?

Autres conseils

Peut-être un peu tard, mais avec quelques astuces de ax et quelques astuces de ici , je pense que l'appel:

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

et le stocker, puis faire un appel à:

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

travaille pour moi. Bien sûr, vous devez remplacer wx.html.HtmlWindow par une référence réelle à une instance.

Voici ce que je fais pour faire défiler la page à la position précédente. Je le fais pour éviter de clignoter.

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

Généralement, les événements de clic sont déclenchés par les événements MouseUp. Si vous suivez la position de la souris en capturant un événement MouseDown, vous saurez où le dernier clic (MouseUp) s’est passé et cela devrait vous permettre de reconstruire les choses.

Pour ce problème particulier, vous devrez peut-être effectuer un peu plus de travail dans MouseDown, par exemple en vérifiant s'ils se trouvent dans le contrôle wxHtmlWindow et, le cas échéant, en enregistrant un numéro de ligne.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top