Question

J'ai une petite application de journalisation (écrite en wxPython) qui reçoit les données d'un peu du kit que nous développons, et je souhaite afficher le texte dans une fenêtre défilante. Dans l'état actuel des choses, j'utilise wx.TextCtrl pour l'affichage de texte, mais le comportement de défilement pose quelques problèmes.

En gros, j'aimerais que, si la barre de défilement se trouve au bas de la fenêtre (c’est-à-dire la fin des données entrantes), l’ajout de données supplémentaires fasse défiler la vue. Si, toutefois, la vue a été légèrement défilée (par exemple, l'utilisateur regarde quelque chose d'intéressant, tel qu'un message d'erreur), l'application doit simplement ajouter le texte à la fin sans plus de défilement.

J'ai deux problèmes en ce moment:

  1. Je ne vois pas comment récupérer la position de défilement actuelle (les appels à GetScrollPos () ne semblent pas fonctionner - ils ne renvoient que 0).
  2. Je ne vois pas comment récupérer la plage actuelle de la barre de défilement (les appels à GetScrollRange () ne font que renvoyer 1).

J'ai un peu cherché sur Google et il semble y avoir quelques indices suggérant que GetScrollPos et GetScrollRange ne fonctionneront pas pour un wx.TextCtrl? Quelqu'un d'autre a-t-il eu une expérience dans ce domaine? Existe-t-il un moyen simple et agréable de résoudre le problème ou vais-je devoir lancer mon propre fichier wx.TextCtrl?

Était-ce utile?

La solution

Je viens de tester un exemple simple (vérification de GetScrollPos (0) et GetScrollRange (0) dans EVT_TEXT du gestionnaire d'événements pour wx .TextCtrl ) et cela fonctionne très bien pour moi - ils renvoient respectivement l’indice de la ligne affichée et le nombre total de lignes.

Peut-être que le problème vient de votre version de wxPython? J'ai utilisé:

>>> import wx
>>> wx.version()
'2.8.9.1 (msw-unicode)'

Autres conseils

D'accord, alors voici où je dois aller:

import wx
from threading import Timer
import time

class Form1(wx.Panel):
    def __init__(self, parent):
        wx.Panel.__init__(self, parent)

        self.logger = wx.TextCtrl(self,5, "",wx.Point(20,20), wx.Size(200,200), \
                wx.TE_MULTILINE |  wx.TE_READONLY)# |  wx.TE_RICH2)

        t = Timer(0.1, self.AddText)
        t.start()

    def AddText(self):
        # Resart the timer
        t = Timer(0.25, self.AddText)
        t.start() 

        # Work out if we're at the end of the file
        currentCaretPosition = self.logger.GetInsertionPoint()
        currentLengthOfText = self.logger.GetLastPosition()
        if currentCaretPosition != currentLengthOfText:
            self.holdingBack = True
        else:
            self.holdingBack = False

        timeStamp = str(time.time())

        # If we're not at the end of the file, we're holding back
        if self.holdingBack:
            print "%s FROZEN"%(timeStamp)
            self.logger.Freeze()
            (currentSelectionStart, currentSelectionEnd) = self.logger.GetSelection()
            self.logger.AppendText(timeStamp+"\n")
            self.logger.SetInsertionPoint(currentCaretPosition)
            self.logger.SetSelection(currentSelectionStart, currentSelectionEnd)
            self.logger.Thaw()
        else:
            print "%s THAWED"%(timeStamp)
            self.logger.AppendText(timeStamp+"\n")

app = wx.PySimpleApp()
frame = wx.Frame(None, size=(550,425))
Form1(frame)
frame.Show(1)
app.MainLoop()

Cette application de démonstration simple fonctionne presque parfaitement. Il défile parfaitement à moins que l'utilisateur ne clique sur une ligne qui ne se trouve pas à la fin du texte. Par la suite, il reste beau et stable afin que vous puissiez sélectionner du texte (remarque: il y a toujours un bogue là-dedans, si vous sélectionnez haut, pas bas, cela efface votre sélection).

Le plus gros désagrément est que si j'essaie d'activer le " | wx.TE_RICH2 " option, tout va un peu en forme de poire. J'ai vraiment besoin de ça pour faire la coloration syntaxique des erreurs, mais si je ne peux pas activer cette option, je suis condamné au monochrome - boo!

D'autres idées sur la façon de retenir le défilement sur le contrôle de saisie enrichi?

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