TextView: Wie programmatisch an Anfang springen?

Programmierung für GNOME und GTK+, GUI-Erstellung mit Glade.
Antworten
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

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?
Zuletzt geändert von framp am Mittwoch 22. August 2012, 20:11, insgesamt 2-mal geändert.
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

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.
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

Meine identische Frage im englischen Python Forum befindet sich hier.
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

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)
Zuletzt geändert von framp am Mittwoch 22. August 2012, 21:38, insgesamt 1-mal geändert.
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.
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

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?
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
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

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:
jesse
User
Beiträge: 15
Registriert: Mittwoch 26. September 2012, 10:12

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.
Zuletzt geändert von jesse am Donnerstag 4. Oktober 2012, 07:39, insgesamt 5-mal geändert.
Benutzeravatar
framp
User
Beiträge: 52
Registriert: Samstag 9. Oktober 2010, 22:16
Wohnort: bei Stuttgart
Kontaktdaten:

Mit marks habe ich bislang noch keinen Kontakt gehabt. Klingt aber sehr gut. Werde die von Dir vorgeschlagene Alternative mal ausprobieren.
jesse
User
Beiträge: 15
Registriert: Mittwoch 26. September 2012, 10:12

Mit den Funktionen textbuffer.place_cursor() und textview.scroll_mark_onscreen(), geht das sogar noch programmatischer.

Hab das oben geändert.
Antworten