Come posso ottenere la posizione / l'intervallo di scorrimento da un controllo wx.TextCtrl in wxPython

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

Domanda

Ho una piccola app di registrazione (scritta in wxPython) che riceve i dati da un po 'di kit che stiamo sviluppando e voglio visualizzare il testo in una finestra a scorrimento. Allo stato attuale sto usando un wx.TextCtrl per la visualizzazione del testo, ma ho dei problemi con il comportamento di scorrimento.

Fondamentalmente, mi piacerebbe che, se la barra di scorrimento si trova nella parte inferiore della finestra (cioè la fine dei dati in arrivo), l'aggiunta di più dati dovesse scorrere la vista in avanti. Se, tuttavia, la vista è stata leggermente spostata verso l'alto (ovvero l'utente sta osservando qualcosa di interessante come un messaggio di errore), l'app dovrebbe semplicemente aggiungere il testo alla fine senza scorrere più.

Al momento ho due problemi:

  1. Non riesco a capire come recuperare la posizione di scorrimento corrente (le chiamate a GetScrollPos () non sembrano funzionare, restituiscono solo 0).
  2. Non riesco a capire come recuperare l'attuale intervallo della barra di scorrimento (le chiamate a GetScrollRange () restituiscono solo 1).

Ho cercato su Google un po 'e sembrano esserci alcuni suggerimenti che suggeriscono che GetScrollPos e GetScrollRange non funzioneranno per un wx.TextCtrl? Qualcun altro ha avuto esperienza in questo settore? Esiste un modo semplice e semplice per risolvere il problema o devo eseguire il rollup del mio wx.TextCtrl?

È stato utile?

Soluzione

Ho appena provato un semplice esempio (controllando GetScrollPos (0) e GetScrollRange (0) in EVT_TEXT gestore eventi per wx .TextCtrl ) e funziona bene per me: restituiscono rispettivamente l'indice della riga attualmente visualizzata e il numero totale di righe.

Forse il problema è la tua versione di wxPython? Ho usato:

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

Altri suggerimenti

Va ??bene, quindi ecco dove devo:

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

Questa semplice app demo funziona quasi perfettamente. Scorre ordinatamente a meno che l'utente non faccia clic su una riga che non si trova alla fine del testo. Successivamente rimane bello e fermo, quindi puoi selezionare il testo (nota: c'è ancora un bug lì nel fatto che se selezioni su non giù, cancella la tua selezione).

Il più grande fastidio è che se provo ad abilitare " | wx.TE_RICH2 " opzione, tutto va un po 'a forma di pera. Ho davvero bisogno di questo per evidenziare la sintassi degli errori, ma se non riesco ad abilitare quell'opzione, sono destinato al monocromo - boo!

Altre idee su come trattenere lo scorrimento sul controllo Rich Edit?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top