TextCtrl(): Nicht mehr als 3000 Zeilen sauber möglich?

Plattformunabhängige GUIs mit wxWidgets.
Antworten
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Hallo,

Hmm, stolpere gerade über ein komisches Verhalten im TextCtrl().

Ich füge zu Testzwecken hier viele Zeilen ein (mittels "SetValue()"),
da viel mir auf, dass das erste "AppendText()" nicht mehr klappte...

Wohlgemerkt, das erste, danach gehts wieder!

Die "magische Grenze" liegt bei exakt 3000 Zeilen,
darunter läuft alles einwandfrei.

Was ist das denn?

Version:
wxPython 2.6.3.3 (ansi) for Python 2.4
auf Windows XP SP2

Beispielcode müsste ich erst machen, damit das hier sauber aussieht,
aber das müsste man sich echt leicht selber bauen können,
es geht ja echt nur um ein hinlänglich grosses SetValue()
gefolgt von einem AppendText() in einem multiline TextCtrl...

Ist natürlich blöd, wenn einem sowas querschiesst...
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

oliver1974 hat geschrieben:Die "magische Grenze" liegt bei exakt 3000 Zeilen, darunter läuft alles einwandfrei.
Hi oliver!

Hier ein Auszug aus der wxWidgets-Referenz:
wxTE_RICH:
Use rich text control under Win32, this allows to have more than 64KB of text in the control even under Win9x. This style is ignored under other platforms.
Brauchst du unter mehreren Plattformen ein größeres Text-Widget, dann kannst du auf ``wx.stc`` oder unter neueren wxPython-Versionen auf ``wx.richtext`` ausweichen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Vorweg, danke. Super!

Mein Kommentar aber dazu: Na toll, ganz grosses Kino.

Ich hab natürlich die Referenz zu TextCtrl gelesen.. Aber nicht
nach diesem einem Flag und vor allem nicht nach "64K" gesucht.

Und selbst wenn, den Satz...
"Use rich text control under Win32, this allows to have more than 64KB of
text in the control even under Win9x. This style is ignored under other
platforms."

... interpretiere ich eigentlich so, dass das mal ein Problem
unter Win9x war ("...even under Win9x"), da muss man
mal halt drauf kommen.

Vielleicht bin ich ja da jetzt zu pingelig, aber es ist doch durchaus
signifikant, wenn sich ein Control ab einer bestimmten Inhaltsgröße
unerwartet verhält, das hätte als Info auch irgendwo "ganz
nach oben" in die Beschreibung zum Control gedurft.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

oliver1974 hat geschrieben:das hätte als Info auch irgendwo "ganz
nach oben" in die Beschreibung zum Control gedurft.
Hi oliver!

Da bin ich ganz deiner Meinung. Ändern wird es sich allerdings nur dann, wenn du diesen Vorschlag an die richtigen Leute bringst.

Melde dich doch mal an die wxPython-Mailingliste an und frage dort nach, was zu tun ist oder wer anzusprechen ist, um einen dementsprechenden Hinweis in die wxWidgets-Referenz hinzuzufügen.

Ich kann kaum Englisch, deshalb muss das jemand anderer machen.

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Hi Gerold!

Ja, da hast du Recht, ich werd mir die Tage mal das mit der Mailingliste ansehen und dann mal sehen, wie ich mich da mit einbringen kann,
dafür sollte mein Englisch noch ausreichen.

Es ist irgendwie schade, wxWidgets/wxPython scheint mir bisher richtig gut
zu sein, es macht richtig Spaß damit zu arbeiten (zumindest für mich), aber
dann wieder solche Klopper. Wäre schade drum, mal sehen, ob ich da was gutes zu beitragen kann.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Boah, man entdeckt aber auch immer wieder neue Geschichten...

Sobald wxTE_RICH gesetzt ist, klappt das automatische Scrolling
(z.B. nach einem AppendText() ) oder WriteText() unter Windows nicht mehr.

Da hilft nach dem Anhängen einer Zeile nur noch ein
ScrollLines(1)...

Okay, muss ich halt noch gucken, was dann unter GTK unter Linux
mit dem dort eigentlich überflüssen ScrollLines passiert.. und
notfalls halt ne plattformbezogene Weiche einbauen.

Nur hilft ScrollLines auch nicht so wirklich, wenn mann mit WriteText()
einen ganzen Batzen (mehrere Zeilen) einfügt, ich kann zwar
dann natürlich mit ScrollLines runterscrollen (über die Anzahl
der eingefügten Zeilen), aber das nimmt dann wxWidgets wirklich
wörtlich... Es scrollt, leibhaftig und deutlich sichtbar, runter, und
das dauert laaaaaaaange wenn man wirklich viel im TextCtrl
hat...

Ich merk schon, TextCtrl ist "non-trivial".
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

oliver1974 hat geschrieben:Sobald wxTE_RICH gesetzt ist, klappt das automatische Scrolling (z.B. nach einem AppendText() ) oder WriteText() unter Windows nicht mehr.
Hi oliver!

Code: Alles auswählen

#!/usr/bin/env python
# -*- coding: iso-8859-1 -*-

import wx

wx.SetDefaultPyEncoding("iso-8859-1")


class MyFrame(wx.Frame):
    
    def __init__(self, parent = None, id = -1, title = "Scrolling"):
        
        wx.Frame.__init__(self, parent, id, title)
        
        panel = wx.Panel(self)
        
        vbox = wx.BoxSizer(wx.VERTICAL)
        panel.SetSizer(vbox)
        
        txt = wx.TextCtrl(
            panel, style = (
                wx.TE_AUTO_SCROLL | wx.TE_MULTILINE | wx.TE_RICH | 
                wx.TE_RICH2 | wx.TE_WORDWRAP
            )
        )
        vbox.Add(txt, 1, wx.ALL | wx.EXPAND, 5)
        self.txt = txt
        
        btn = wx.Button(panel, -1, "Klick mich")
        vbox.Add(btn, 0, wx.ALL | wx.ALIGN_CENTER, 5)
        btn.Bind(wx.EVT_BUTTON, self.append_text)

    
    def append_text(self, event = None):
        
        txt = self.txt
        
        txt.Freeze()
        txt.AppendText("Ich bin gekommen um zu bleiben. " * 10)
        txt.Thaw()
        
        txt.ShowPosition(txt.GetInsertionPoint())


def main():
    """Testen"""
    
    app = wx.PySimpleApp()
    f = MyFrame()
    f.Center()
    f.Show()
    app.MainLoop()


if __name__ == "__main__":
    main()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
oliver1974
User
Beiträge: 97
Registriert: Donnerstag 26. Oktober 2006, 15:01

Mönsch Gerold, Du wirst ja hier zum persönlichen Supporter.. :D

Also:
txt.ShowPosition(txt.GetInsertionPoint())

Hilft bei mir irgendwie nicht weiter, zumindest in meiner Applikation
habe ich dann einen "sprung", d.h. wenn er unten angekommen
ist, scrolled er nicht weiter, sondern setzt die neue Zeile
ganz oben hin, scrollt also jetzt mehr zeilenweise,
was bei mir nicht ganz so schön ist.

Interessanter sind da Freeze() und Thaw().. Ich hab
die jetzt da eingefügt, wo ich meine vielen Zeilen einfüge,
und quasi das ScrollLines zwischen Freeze und Thaw gehängt..
Das hilft auch erstmal, zumidest scrolled er jetzt auf "einen Rutsch"
bzw. nicht mehr so sichtbar, aber es dauert immer noch so seine
Zeit bis er den "Sprung" nach unten macht...

Also, für mich wäre die Lösung erstmal akzeptabel, aber so
der Hammer ist das für andere Apps vielleicht noch nciht...

Hmmm, ich glaube ich sollte mir mal echt wx.stc oder
wx.richtext ansehen, oder?
Antworten