这是我的问题,我无法在其他地方找到答案。我想在Gtk textview(python3)中显示一些文本,每行文本后面都有一个新行。当我使用" \ n"时,它会显示" \ n"而不是实际添加新行。有没有办法解决这个问题?
这应该是我的问题的可重现版本,然后我的输出......(ps。我不是一个有经验的程序员)
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
records = ()
tv = Gtk.TextView()
records += ("a", "\n", "b", "\n", "c", "\n")
tb = tv.get_buffer()
tb.set_text(str(records))
sw = Gtk.ScrolledWindow()
sw.set_size_request(300,400)
sw.add(tv)
w = Gtk.Window()
w.add(sw)
w.show_all()
Gtk.main()
Gtk窗口中的当前输出:
('a','\n','b', '\n', 'c')
Gtk窗口中的所需输出:
'a'
'b'
'c'
答案 0 :(得分:4)
添加到textbuffer
,而不是先读取它,可以使用iters
(这类指向缓冲区的内容)来完成。例如,您可以在缓冲区的末尾添加asking for an iter
at the end:
bff = Gtk.TextBuffer()
view = Gtk.TextView(buffer = bff)
bff.set_text("This is the beginning\n")
iter = bff.get_end_iter()
bff.insert(iter, "And this is a newly inserted line\n")
您也可以插入:
get_start_iter
),get_iter_at_offset
),get_iter_at_line
),get_iter_at_mark
)等等...... 答案 1 :(得分:1)
您需要将名为records
的变量中的数据加入一个字符串中,如下所示:
import gi
gi.require_version("Gtk", "3.0")
from gi.repository import Gtk
records = ()
tv = Gtk.TextView()
records += ("a", "\n", "b", "\n", "c", "\n")
tb = tv.get_buffer()
# join in one single string
tb.set_text("".join(records))
sw = Gtk.ScrolledWindow()
sw.set_size_request(300,400)
sw.add(tv)
w = Gtk.Window()
# Don't forget to connect your window's close button
# to Gtk.main_quit signal, or whatever the signal you want
w.connect("delete-event", Gtk.main_quit)
w.add(sw)
w.show_all()
Gtk.main()
Gtk窗口内的输出将是:
a
b
c
答案 2 :(得分:1)
我已经看到了一种通过使用%s
字符串格式来解决此问题的方法。以下是我实际使用的代码示例:
tv = Gtk.TextView()
for record in records:
records_str += "Title: %s \nAuthors: %s \nSource: %s\n\n" %(record.get("TI"), ", ".join(record.get("AU")), record.get("SO"))
tb = tv.get_buffer()
tb.set_text("".join(records_str))
这会在不同的行上打印“标题”,“作者”和“来源”。