Seite 1 von 1

TextView: Wie programmatisch an Anfang springen?

Verfasst: Sonntag 1. Juli 2012, 19:07
von framp
In einer textView gebe ich Informationen aus, die die aktuellen Aktiviäten meines Programmes ausgeben. Am Ende schreibe ich neue Info in den textView (Das Ergebnis des Programms) und möchte dazu wieder an den Anfang springen, so dass den Benutzer dann von oben nach unten die Programmergebnisse lesen kann.

Habe es mit

Code: Alles auswählen

self.reportView.scroll_to_iter(textbuffer.get_start_iter(), 0)
wie auch

Code: Alles auswählen

self.reportView.get_vadjustment().set_value(0)
probiert - aber leider kein Erfolg. Kann mir jemand einen Tip geben wie ich das hinbekommen kann?

Re: TextView: Wie programmatisch an den Anfang springen?

Verfasst: Mittwoch 11. Juli 2012, 19:36
von framp
Leider scheint keiner zu wissen wie man das Problem lösen kann :cry: Ich warte noch bis zum Wochenende und werde das Problem - sofern hier nichts mehr passiert mal im englischen Python Forum schildern. Sofern dort hilfreiche Antworten kommen werde ich sie hier in Deutsch einstellen.

Re: TextView: Wie programmatisch an den Anfang springen?

Verfasst: Sonntag 15. Juli 2012, 13:18
von framp
Meine identische Frage im englischen Python Forum befindet sich hier.

Re: TextView: Wie programmatisch an den Anfang springen?

Verfasst: Mittwoch 22. August 2012, 20:10
von framp
Eben sind es 580 Zugriffe auf meine Frage - aber keiner hat eine Antwort :-(.

Anbei eine Lösung die ich nach längerem Suchen dann irgendwann gefunden habe:

Code: Alles auswählen

        scrollWindow=self.glade.get_object("textViewWindow")
        adjustment=scrollWindow.get_vadjustment()
        adjustment.set_value(0)
Edit: Removed mainiteration (siehe post weiter unten for details)

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Mittwoch 22. August 2012, 20:57
von lunar
@framp Das ist nur nötig, wenn Dein Programm die Hauptschleife von Gtk blockiert. Das ist Dein eigentliches Problem, die Hauptschleife mit "mainiteration()" manuell aufzurufen, ist nicht die Lösung des Problems, sondern ein Workaround um ein grundlegendes strukturelles Problem Deines Quelltexts.

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Mittwoch 22. August 2012, 21:37
von framp
lunar hat geschrieben:@framp Das ist nur nötig, wenn Dein Programm die Hauptschleife von Gtk blockiert. Das ist Dein eigentliches Problem, die Hauptschleife mit "mainiteration()" manuell aufzurufen, ist nicht die Lösung des Problems, sondern ein Workaround um ein grundlegendes strukturelles Problem Deines Quelltexts.
Danke für den Hinweis. Ich habe mir das noch mal genauer angesehen und in der Tat ist das nicht notwendig für das Scrollen. Weiter vorne in meinem Code wird eine Datei eingelesen was die Hauptschleife blockiert. Nur dort ist ein mainiteration notwendig.

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Mittwoch 22. August 2012, 21:44
von EyDu
Da der Inhalt der Datei zum Zeitpunkt des Scrollens noch nicht notwendig zu sein scheint, stellt sich die Frage, warum du dass nicht einfach in einen Thread auslagerst. Dann musst du nicht mehr so einen seltsamen Hack anwenden.

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Mittwoch 22. August 2012, 21:52
von framp
EyDu hat geschrieben:[...] warum du dass nicht einfach in einen Thread auslagerst [..].
Weil ich mit Threading in Python bislang noch nicht beschäftigt habe und erst einmal froh bin, mit gtk so langsam zurecht zu kommen. :wink: Ist aber sicherlich später mal eine Aktion das in einen Thread zu legen. Hast Du zufällig einen Link zu Threading den Du empfehlen kannst?
[...]Dann musst du nicht mehr so einen seltsamen Hack anwenden.
Ist zwar OT - aber da ich der TE bin erlaube ich mir das mal :roll: : Was ist daran ein Hack?

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Mittwoch 22. August 2012, 22:16
von lunar
@framp In einer GUI sollte grundsätzlich alles, was länger als ein paar Millisekunden benötigt, asynchron ablaufen, damit die Hauptschleife nicht blockiert. Deine Anwendung ist nicht asynchron, sondern blockiert die Hauptschleife. Deine Lösung löst mithin nicht das eigentliche Problem, sondern behebt nur eines seiner Symptome. Das entspricht so ziemlich genau der Definition von "Hack" (zumindest nach englischer Wikipedia):
In modern computing terminology, a kludge (or often a "hack") is a solution to a problem, doing a task, or fixing a system that is inefficient, inelegant, or even unfathomable, but which nevertheless (more or less) works

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Mittwoch 22. August 2012, 23:08
von framp
Wenn Du diese Definition zugrunde legt ist es ein Hack. Für mich ist ein Hack allerdings etwas wo man hinten durchs Auge durch die Brust etwas macht was i.d.R. kein anderer mehr versteht. Da mainiteration() explizit angeboten wird von gtk und klar dokumentiert ist was da passiert ist es nach meiner Definition kein Hack. Somit stimmt die Welt für uns beide :lol:

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Donnerstag 27. September 2012, 17:13
von jesse
Das geht über die Markierung (gtk.TextMark) insertion point im TextBuffer:

Code: Alles auswählen

textbuffer.place_cursor(textbuffer.get_start_iter())
textview.scroll_mark_onscreen(textbuffer.get_insert())
Das nimmt auch den Cursor mit an den Anfang.

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Donnerstag 27. September 2012, 22:51
von framp
Mit marks habe ich bislang noch keinen Kontakt gehabt. Klingt aber sehr gut. Werde die von Dir vorgeschlagene Alternative mal ausprobieren.

Re: TextView: Wie programmatisch an Anfang springen?

Verfasst: Donnerstag 4. Oktober 2012, 07:33
von jesse
Mit den Funktionen textbuffer.place_cursor() und textview.scroll_mark_onscreen(), geht das sogar noch programmatischer.

Hab das oben geändert.