首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >滚动到ScrolledWindow/TextView的结尾

滚动到ScrolledWindow/TextView的结尾
EN

Stack Overflow用户
提问于 2013-02-08 18:02:10
回答 3查看 5.1K关注 0票数 12

在一个使用Python的GTK3程序中,我实现了一个日志。这是一个在ScrolledWindow中包含TextBuffer的TextView。通过一个例程,我在这个日志中添加了一个新行。之后,它应该滚动到最后一行。

代码语言:javascript
复制
def append_log(self, line):
    self.textbuffer.insert(self.textbuffer.get_end_iter(), "\n"+line, -1)
    # scrolling down

它应该看起来像这样:http://www.physik.tu-dresden.de/~s9472632/log_manual.png

但它不起作用。我已经尝试了以下代码。

代码语言:javascript
复制
# nothing happens
adj = self.scrolledwindow.get_vadjustment()
adj.set_value(adj.get_upper()-adj.get_page_size())    # same without subtraction (only upper or page_size)
self.scrolledwindow.set_vadjustment(adj)              # with and without this line

代码语言:javascript
复制
# nothing happens
self.textview.scroll_to_iter(self.textbuffer.get_end_iter(), 0.0, False, 0.5, 0.5)

代码语言:javascript
复制
# works a bit but scroll bars cover the text (see picture below)
self.textview.scroll_to_mark(self.textbuffer.get_insert(), 0.0, False, 0.5, 0.5)

图片来源:http://www.physik.tu-dresden.de/~s9472632/log_scroll.png

似乎scroll_to*的最后四个参数(within_margin,use_align,xalign,yalign)对结果没有影响。

如何让它工作?

再见,马库斯

EN

回答 3

Stack Overflow用户

发布于 2013-04-13 21:40:45

所以我想我知道问题所在。我想你连接了错误的信号,所以TextView还没有要求新的尺寸。下面的代码使用了TextViewsize-allocate信号,它的工作方式非常出色。

代码语言:javascript
复制
#!/usr/bin/env python

from gi.repository import Gtk, GObject


class W(Gtk.Window):

    def __init__(self):

        super(W, self).__init__()
        self.connect("destroy", Gtk.main_quit)
        self.set_default_size(200, 400)

        self._msg_i = 0
        self._sw = Gtk.ScrolledWindow()
        self.add(self._sw)

        self._tw = Gtk.TextView()
        self._tb = self._tw.get_buffer()

        self._sw.add_with_viewport(self._tw)
        #The signal should at least be connected after the scrolled window
        #is created, since the callback works on it.
        self._tw.connect("size-allocate", self._autoscroll)

        GObject.timeout_add(400, self.sim_log)  # Invokes spamming
        self.show_all()

    def sim_log(self, *args):
        """A simple spamming function to emulate some sort of logging"""
        self._msg_i += 1
        i = self._tb.get_end_iter()
        self._tb.insert(i, "\n* Message {0} recieved!".format(self._msg_i), -1)
        return True

    def _autoscroll(self, *args):
        """The actual scrolling method"""
        adj = self._sw.get_vadjustment()
        adj.set_value(adj.get_upper() - adj.get_page_size())


if __name__ == "__main__":

    w = W()
    Gtk.main()
票数 12
EN

Stack Overflow用户

发布于 2015-04-14 23:26:36

我刚刚拿到了这个,并使scroll_to_mark行工作。我认为您的问题是将'use_align‘设置为False。该行应为:

代码语言:javascript
复制
self.textview.scroll_to_mark(self.textbuffer.get_insert(), 0.0, True, 0.5, 0.5)
票数 4
EN

Stack Overflow用户

发布于 2016-12-02 02:19:44

对于gtkmm 3.0/C++11:

代码语言:javascript
复制
void append(std::string s) {
  textbuffer->insert(textbuffer->end(), s.c_str());

  // Wait for Gui to Redraw with added line to buffer
  while (gtk_events_pending())
    gtk_main_iteration_do(false);

  // Scoll to end of Buffer
  auto it = textbuffer->get_iter_at_line(textbuffer->get_line_count());
  TextView1.scroll_to(it);
}
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14770018

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档