Pergunta

Eu tenho um aplicativo de registro pequena (escrito em wxPython) que recebe dados de um pouco de kit que estamos desenvolvendo, e eu quero mostrar o texto em uma janela de rolagem. Tal como está Eu estou usando um wx.TextCtrl para a exibição de texto, mas eu estou tendo alguns problemas com o comportamento de rolagem.

Basicamente, eu gostaria que ele para que, se a barra de rolagem é na parte inferior da janela (ou seja, o fim dos dados de entrada), adicionando mais dados deve rolar a exibição em diante. Se, no entanto a vista foi rolada para cima um pouco (ou seja, o usuário está olhando para algo interessante como uma mensagem de erro), o aplicativo deve basta adicionar o texto na extremidade sem rolagem mais.

Eu tenho dois problemas no momento:

  1. Eu não posso trabalhar para fora como para recuperar a posição de rolagem atual (chamadas para GetScrollPos () não parecem trabalho - eles só retornam 0).
  2. Eu não posso trabalhar para fora como para recuperar a actual gama da barra de rolagem (chamadas para GetScrollRange () retornam apenas 1).

Eu pesquisei um pouco e parece haver algumas dicas que sugerem GetScrollPos e GetScrollRange não vai funcionar para um wx.TextCtrl? Tem mais alguém teve alguma experiência nesta área? Existe uma boa maneira fácil de resolver o problema ou eu vou ter que fazer a minha própria wx.TextCtrl?

Foi útil?

Solução

Eu só testou um exemplo simples (verificação GetScrollPos(0) e GetScrollRange(0) no manipulador de eventos EVT_TEXT para wx.TextCtrl) e ele funciona muito bem para mim -. Eles retornam índice de linha actualmente mostrado eo número total de linhas, respectivamente

Talvez o problema é a sua versão wxPython? Eu usei:

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

Outras dicas

Ok, então aqui é onde eu tenho 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()

Este aplicativo simples demonstração funciona quase perfeitamente. Ele rola perfeitamente a menos que o usuário clica em uma linha que não está no final do texto. Depois disso ele permanece agradável e ainda assim você pode selecionar o texto. (Nota: ainda há um bug em que se você selecionar acima não traga ele limpa sua seleção)

O maior incômodo é que se eu tentar e habilitar a opção "| wx.TE_RICH2" opção, tudo vai em forma de pêra um pouco. Eu realmente preciso disso para fazer destaque de sintaxe de erros, mas se eu não posso permitir essa opção, eu estou condenado a monocromática - boo

Qualquer mais ideias sobre como segurar rolagem no controle rich edit?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top