Как получить положение / диапазон прокрутки из элемента управления wx.TextCtrl в wxPython

У меня есть небольшое приложение для ведения журнала (написанное на wxPython), которое получает данные из небольшого набора, который мы разрабатываем, и я хочу отображать текст в окне с прокруткой. В нынешнем виде я использую wx.TextCtrl для отображения текста, но у меня возникают проблемы с прокруткой.

В принципе, мне бы хотелось, чтобы, если полоса прокрутки находилась в нижней части окна (т.е. в конце входящих данных), добавление дополнительных данных должно было прокручивать представление вперед. Если, однако, представление было немного прокручено (т.е. пользователь смотрит на что-то интересное, например, сообщение об ошибке), приложение должно просто добавить текст в конце без дополнительной прокрутки.

У меня сейчас две проблемы:

  1. Я не могу понять, как получить текущую позицию прокрутки (вызовы GetScrollPos (), похоже, не работают - они просто возвращают 0).
  2. Я не могу понять, как получить текущий диапазон полосы прокрутки (вызовы GetScrollRange () просто возвращают 1).

Я немного погуглил, и, похоже, есть несколько подсказок, которые предполагают, что GetScrollPos и ​​GetScrollRange не будут работать для wx.TextCtrl? У кого-нибудь еще был опыт в этой области? Есть ли простой способ решить проблему, или мне придется использовать собственный wx.TextCtrl?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
0
8 041
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Я только что протестировал простой пример (проверка GetScrollPos(0) и GetScrollRange(0) в обработчике событий EVT_TEXT для wx.TextCtrl), и он отлично работает для меня - они возвращают индекс текущей отображаемой строки и общее количество строк соответственно.

Может проблема в вашей версии wxPython? Я использовал:

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

Хороший момент - похоже, я случайно вызвал фрейм окна вместо вложенного CTextCtrl. Я все еще застрял, пытаясь остановить прокрутку объекта, когда он не находится в нижней части диапазона прокрутки ...

Jon Cage 01.10.2008 02:46

Хорошо, вот где мне нужно:

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

Это простое демонстрационное приложение работает почти идеально. Он аккуратно прокручивается, если пользователь не щелкает строку, которая не находится в конце текста. После этого он остается красивым и неподвижным, так что вы можете выбрать текст (примечание: все еще есть ошибка в том, что если вы выбираете вверх, а не вниз, он очищает ваш выбор).

Самое большое раздражение заключается в том, что если я попытаюсь включить опцию "| wx.TE_RICH2", все станет немного грушевидным. Мне это действительно нужно для подсветки синтаксиса ошибок, но если я не могу включить эту опцию, я обречен на монохромный - бух!

Есть еще идеи о том, как сдерживать прокрутку в элементе управления Rich Edit?

Другие вопросы по теме