如何在 Gtk 文本视图中添加新行?
How to add a new line in Gtk textview?
这是我的问题,我在别处找不到答案。我想在 Gtk 文本视图 (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 中的当前输出 window:
('a','\n','b', '\n', 'c')
Gtk 中的期望输出 window:
'a'
'b'
'c'
您需要将名为 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 window 中的输出将是:
a
b
c
添加到 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
),
- 在某些'marks'你在文中留下(
get_iter_at_mark
)等...
有人向我展示了使用 %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))
这会在不同的行上打印 "Title"、"Author" 和 "Source"。
这是我的问题,我在别处找不到答案。我想在 Gtk 文本视图 (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 中的当前输出 window:
('a','\n','b', '\n', 'c')
Gtk 中的期望输出 window:
'a'
'b'
'c'
您需要将名为 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 window 中的输出将是:
a
b
c
添加到 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
), - 在某些'marks'你在文中留下(
get_iter_at_mark
)等...
有人向我展示了使用 %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))
这会在不同的行上打印 "Title"、"Author" 和 "Source"。