【问题标题】:adding a textview to scrolledwindow in pygtk在 pygtk 中将文本视图添加到滚动窗口
【发布时间】:2023-08-11 16:29:01
【问题描述】:

我正在尝试将一些文本添加到 pygtk 的滚动窗口中。 textview 包装在一个简单的盒子容器中。我在网上搜索并知道我需要先添加一个视口才能使其正常工作,但我不断收到以下错误:

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”文件中的滚动窗口中添加了一个视口。欢迎任何帮助或在线资源。

【问题讨论】:

  • 您是否尝试过直接将 TextView 添加到 ScrolledWindow 中?这就是我在我的一个脚本中使用它的方式。
  • @SiHa 是的,我做到了并且有效,但它不符合我的要求。这是一个简单的聊天窗口,我想将每条消息打包到一个容器中,就像我们在 html 中使用
    / 一样。此外,我将它打包在一个盒子里,因为我想在它上面应用我的自定义 CSS,正如这里 link 解释的那样,使用 .set_name('mywindow') 作为 id 选择器。
  • 啊。那么下面的答案有帮助吗?
  • 你不能实例化Gtk.Box,它是抽象的。而是选择Gtk.VBoxGtk.HBox 之一。

标签: python linux gtk pygtk glade


【解决方案1】:

第一次错过了真正的原因。

问题是您向视口添加了多个小部件(只能有一个小部件)。

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

转换为:“视口没有子级的断言是错误的”,因为您已经添加了一些东西。

您需要将所有容器打包到另一个容器中,然后将其添加到视口中。

【讨论】:

  • 没有。我以前试过这个,现在也试过了。我收到以下错误:- Gtk-CRITICAL **: gtk_scrolled_window_add_with_viewport: assertion 'gtk_bin_get_child (GTK_BIN (child_widget)) == NULL' failed 这是我现在的代码:-
     def on_button1_clicked(self,button): 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.sw.add_with_viewport(container)  *使用 gi.repository
【解决方案2】:

它与 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() 方法以在滚动窗口中显示小部件。我尝试像container.show()这样向容器中添加show,但它没有显示出来。

【讨论】:

  • 如果我在上面回答了您的问题,您介意将其标记为已回答吗?发布一个不同的问题作为答案并不是真正获得新问题最大曝光率的最佳方式,我只是偶然发现了它。要回答您的第二个问题,请尝试show_all() 显示一个小部件及其所有子级。除非您要隐藏和显示不同的小部件,否则最简单的方法是在定义完所有内容后在*窗口上调用 show_all
猜你喜欢
相关资源
最近更新 更多
热门标签