Como faço para obter a posição de rolagem / intervalo de um controle wx.TextCtrl em wxPython
-
03-07-2019 - |
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:
- 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).
- 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?
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?