Pregunta

Tengo una pequeña aplicación de registro (escrita en wxPython) que recibe datos de un poco del kit que estamos desarrollando, y quiero mostrar el texto en una ventana de desplazamiento. Tal como está, estoy usando un wx.TextCtrl para la visualización de texto, pero tengo algunos problemas con el comportamiento de desplazamiento.

Básicamente, me gustaría que, si la barra de desplazamiento se encuentra en la parte inferior de la ventana (es decir, al final de los datos entrantes), agregar más datos debería desplazar la vista hacia adelante. Si, sin embargo, la vista se ha desplazado un poco hacia arriba (es decir, el usuario está viendo algo interesante como un mensaje de error), la aplicación debería agregar el texto al final sin desplazarse más.

Tengo dos problemas en este momento:

  1. No puedo averiguar cómo recuperar la posición de desplazamiento actual (las llamadas a GetScrollPos () no parecen funcionar, solo devuelven 0).
  2. No puedo averiguar cómo recuperar el rango actual de la barra de desplazamiento (las llamadas a GetScrollRange () solo devuelven 1).

He buscado un poco en Google y parece que hay algunos consejos que sugieren que GetScrollPos y GetScrollRange no funcionan para un wx.TextCtrl? ¿Alguien más ha tenido alguna experiencia en esta área? ¿Hay alguna forma fácil y fácil de resolver el problema o voy a tener que rodar mi propio wx.TextCtrl?

¿Fue útil?

Solución

Acabo de probar un ejemplo simple (verificando GetScrollPos (0) y GetScrollRange (0) en el EVT_TEXT para wx .TextCtrl ) y funciona bien para mí: devuelven el índice de la línea que se muestra actualmente y el número total de líneas, respectivamente.

¿Quizás el problema sea tu versión wxPython? Yo utilicé:

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

Otros consejos

Bien, aquí es donde tengo que:

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()

Esta aplicación de demostración simple funciona casi perfectamente. Se desplaza ordenadamente a menos que el usuario haga clic en una línea que no esté al final del texto. De ahí en adelante, se mantendrá agradable e inmóvil para que pueda seleccionar texto (nota: todavía hay un error en eso: si selecciona hacia arriba, no borra su selección).

La mayor molestia es que si intento habilitar " | wx.TE_RICH2 " Opción, todo va un poco en forma de pera. Realmente necesito esto para hacer un resaltado de sintaxis de los errores, pero si no puedo habilitar esa opción, estoy condenado al monocromo, ¡boo!

¿Tiene más ideas sobre cómo contener el desplazamiento en el control de edición enriquecida?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top