在pygtk中将TextView添加到ScrolledWindow

0 投票
2 回答
1240 浏览
提问于 2025-04-18 11:44

我正在尝试在pygtk中向一个可滚动窗口添加一些文本。这个文本视图被放在一个简单的盒子容器里。我在网上查了一下,发现我需要先添加一个视口(viewport),这样才能正常工作,但我总是遇到以下错误:

Gtk-CRITICAL **: gtk_viewport_add: assertion 'gtk_bin_get_child (bin) == NULL' failed

这是我的代码:

container = Gtk.Box()
container.set_name('text_container')

tv = Gtk.TextView()
text_input = self.builder.get_object('entry1')
text = text_input.get_text()
text_input.set_text('')
tv.get_buffer().set_text(text)

container.pack_start(tv,True,True,0)
self.viewport.add(container)

我之所以采用这种方法,是因为我已经在我的“glade”文件中向可滚动窗口添加了一个视口。欢迎任何帮助或在线资源。

2 个回答

2

第一次没抓住真正的问题。

问题在于你往视口里添加了多个小部件,而视口只能放一个小部件。

gtk_viewport_add: assertion 'gtk_bin_get_child (bin) == NULL' failed

这句话的意思是:“视口里不能有其他东西,但你已经放了一个。”

你需要把所有的容器放进另一个容器里,然后再把那个容器添加到视口中。

0

之前我用HBox/VBox的时候,一切都正常,只有这个问题。不过现在我用了add_with_viewport()这个方法,我应该在什么对象上调用show()方法,才能让我添加的控件显示出来呢?下面是最终的代码:

container = Gtk.VBox()
container.set_name('text_container')
tv = Gtk.TextView()
text_input = self.builder.get_object('entry1')
text = text_input.get_text()
if text:
        text_input.set_text('')
        tv.get_buffer().set_text(text)

        container.pack_start(tv,True,True,0)
        self.sw.add_with_viewport(container)

因为没有变量指向刚刚添加的视口,我应该在什么对象上调用show()方法,才能让控件在滚动窗口中显示出来。我试着在容器上加show,比如用container.show(),但它还是没有显示。

撰写回答