gpt4 book ai didi

python - 滚动到 ScrolledWindow/TextView 的末尾

转载 作者:太空狗 更新时间:2023-10-29 20:18:54 26 4
gpt4 key购买 nike

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

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

但它不起作用。我试过以下代码。

# 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

.

# nothing happens
self.textview.scroll_to_iter(self.textbuffer.get_end_iter(), 0.0, False, 0.5, 0.5)

.

# 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)似乎对结果没有影响。

它是如何工作的?

再见马库斯

最佳答案

所以我想我知道问题所在。我认为您连接了错误的信号,因此 TextView 尚未请求新的尺寸。下面的代码使用 TextViewsize-allocate 信号,它的效果非常好。

#!/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()

关于python - 滚动到 ScrolledWindow/TextView 的末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14770018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com