2008-09-30 20 views
1

J'ai une petite application de journalisation (écrite en wxPython) qui reçoit des données d'un peu de kit que nous développons, et je veux afficher le texte dans une fenêtre de défilement. En l'état, j'utilise un wx.TextCtrl pour l'affichage du texte, mais j'ai quelques problèmes avec le comportement de défilement. Fondamentalement, je voudrais que si la barre de défilement est au bas de la fenêtre (c'est-à-dire la fin des données entrantes), l'ajout de plus de données devrait faire défiler la vue vers l'avant. Si, toutefois, la vue a été légèrement défilée (c'est-à-dire que l'utilisateur regarde quelque chose d'intéressant comme un message d'erreur), l'application devrait simplement ajouter le texte à la fin sans plus défiler.Comment puis-je obtenir la position/plage de défilement à partir d'un contrôle wx.TextCtrl dans wxPython

J'ai deux problèmes au moment:

  1. Je ne peux pas trouver comment récupérer la position actuelle du défilement (appels à GetScrollPos() ne semblent pas travailler - ils reviennent seulement 0).
  2. Je n'arrive pas à trouver comment récupérer la plage actuelle de la barre de défilement (les appels à GetScrollRange() retournent simplement 1).

J'ai googlé un peu et il semble y avoir quelques indices qui suggèrent que GetScrollPos et GetScrollRange ne fonctionneront pas pour un wx.TextCtrl? Quelqu'un d'autre a-t-il de l'expérience dans ce domaine? Existe-t-il un moyen facile de résoudre le problème ou dois-je lancer mon propre fichier wx.TextCtrl?

Répondre

1

Je viens de tester un exemple simple (vérification GetScrollPos(0) et GetScrollRange(0) dans le gestionnaire d'événements pour EVT_TEXTwx.TextCtrl) et il fonctionne très bien pour moi - ils reviennent index de la ligne actuellement affiché et le nombre total de lignes, respectivement.

Peut-être que le problème est votre version de wxPython? Je:

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

Bon point - on dirait que j'ai involontairement appelé le cadre de la fenêtre au lieu du CTextCtrl imbriqué. Je suis toujours coincé en essayant d'arrêter le défilement quand il n'est pas au bas de la plage de défilement ... –

4

Ok, donc est là où je dois:

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 simple application de démonstration fonctionne presque parfaitement. Il défile proprement à moins que l'utilisateur clique sur une ligne qui n'est pas à la fin du texte. Par la suite, il reste agréable et toujours de sorte que vous pouvez sélectionner le texte (note: il y a toujours un bogue là-dedans, si vous sélectionnez en haut et non en bas, cela efface votre sélection).

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

D'autres idées sur la façon de retarder le défilement sur le contrôle d'édition riche?

Questions connexes