Wie erhalte ich die Scroll-Position / Bereich von einer wx.TextCtrl Steuerung in wxPython
-
03-07-2019 - |
Frage
Ich habe ein kleines Logging-App (geschrieben in wxPython) die Daten von einem Bit-Kit erhält die wir entwickeln, und ich mag den Text in einem scrollenden Fenster angezeigt werden soll. Wie es aussieht, ich bin ein wx.TextCtrl für die Textanzeige mit, aber ich habe einige Probleme mit dem Scroll-Verhalten haben.
Im Grunde würde ich es gerne so, dass, wenn die Bildlaufleiste am unteren Rand des Fensters (das heißt das Ende der eingehenden Daten), sind mehr Daten hinzufügen weiter die Ansicht blättern. Wenn jedoch hat sich die Ansicht gescrollt wurde oben ein wenig (das heißt der Nutzer sucht auf etwas Interessantes wie eine Fehlermeldung), sollte die App nur den Text am Ende hinzufügen, ohne mehr zu scrollen.
Ich habe zwei Probleme im Moment:
- Ich kann aus nicht funktionieren, wie die aktuelle Bildlaufposition abzurufen (Anrufe zu GetScrollPos () scheint nicht zu funktionieren - sie zurückkehren 0 nur).
- Ich kann aus nicht funktionieren, wie der aktuellen Bereich der Bildlaufleiste abrufen (Anruf zu GetScrollRange () nur 1 zurück).
Ich habe ein bisschen gegoogelt und es scheint ein paar Hinweise zu sein, die GetScrollPos und GetScrollRange vorschlagen wird für eine wx.TextCtrl nicht? Hat jemand keine Erfahrung in diesem Bereich hat? Gibt es eine nette einfache Möglichkeit, das Problem zu lösen oder werde ich meine eigene wx.TextCtrl rollen?
Lösung
Getestet habe ich nur ein einfaches Beispiel (GetScrollPos(0)
und GetScrollRange(0)
in EVT_TEXT
Ereignishandler für wx.TextCtrl
Kontrolle) und es funktioniert gut für mich -. Sie Index der aktuell angezeigten Zeile und Gesamtanzahl der Zeilen zurückgeben bzw.
Vielleicht ist das Problem ist Ihre WxPython Version? Früher habe ich:
>>> import wx
>>> wx.version()
'2.8.9.1 (msw-unicode)'
Andere Tipps
Okay, also hier ist, wo ich habe an:
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()
Diese einfache Demo-Anwendung fast perfekt funktioniert. Es rollt ordentlich, wenn der Benutzer eine Zeile klickt, die nicht am Ende des Textes. Danach bleibt es schön und noch so Sie Text auswählen können (Anmerkung: Es gibt immer noch einen Fehler, dass, wenn Sie nicht nach unten, wählen Sie bis es löscht Ihre Auswahl).
Das größte Ärgernis ist, dass, wenn ich das versuchen und aktivieren Sie „| wx.TE_RICH2“ Option, es geht alles etwas birnenförmig. Ich brauche diese wirklich Syntax-Hervorhebung von Fehlern zu tun, aber wenn ich diese Option nicht aktivieren können, ich bin zu monochromen zum Scheitern verurteilt - boo
Jede weitere Ideen, wie auf der Rich Edit-Steuerung zurück zu halten Scrollen?