#python #linux #gtk #pygtk #glade
#python #linux #gtk #pygtk #поляна
Вопрос:
Я пытаюсь добавить некоторый текст в scrolledwindow в pygtk. Textview упакован внутри простого контейнера box. Я искал в Интернете и узнал, что мне нужно сначала добавить окно просмотра, чтобы это работало, но я продолжаю получать следующую ошибку:
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». Приветствуется любая помощь или онлайн-ресурсы.
Комментарии:
1. Вы пробовали просто добавить TextView непосредственно в ScrolledWindow? Вот как у меня это есть в одном из моих сценариев.
2. @SiHa да, я сделал, и это работает, но это не соответствует моему требованию. Это простое окно чата, и я хочу захотеть упаковать каждое сообщение в контейнер точно так же, как мы делаем с <div>/ в html. Более того, я упаковал его в коробку, потому что хотел применить к нему свой пользовательский CSS, как описано здесь по ссылке, используя .set_name(‘mywindow’) для работы в качестве селектора идентификаторов.
3. Ах. Поможет ли тогда ответ ниже?
4. Вы не можете создать экземпляр
Gtk.Box
, это абстрактно. Вместо этого выберите одно изGtk.VBox
илиGtk.HBox
.
Ответ №1:
Пропустил реальную причину в первый раз.
Проблема в том, что вы добавляете более одного виджета в окно просмотра (в котором может быть только один виджет).
gtk_viewport_add: assertion 'gtk_bin_get_child (bin) == NULL' failed
Переводится как: «Утверждение о том, что окно просмотра не имеет дочерних элементов, является ложным», потому что вы уже что-то добавили.
Вам нужно упаковать все ваши контейнеры в другой контейнер, а затем добавить его в окно просмотра.
Комментарии:
1. Нет. Я пробовал это раньше и пробовал это и сейчас. Я получаю следующую ошибку: — Gtk-CRITICAL **: gtk_scrolled_window_add_with_viewport: ошибка утверждения ‘gtk_bin_get_child (GTK_BIN (child_widget)) == NULL’ вот мой код сейчас: — <pre> def on_button1_clicked (self, кнопка): контейнер = 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(текст) container.pack_start(tv, True, истина,0) self.sw.add_with_viewport(контейнер) <код> * с использованием 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(), чтобы виджет отображался в scrolledwindow. Я попытался добавить show в контейнер, подобный container.show()
но он не появился.
Комментарии:
1. Если бы я ответил на ваш вопрос выше, не могли бы вы отметить его как ответ? Публикация другого вопроса в качестве ответа на самом деле не лучший способ получить максимальную информацию о новом вопросе, я наткнулся на него случайно. Чтобы ответить на ваш второй вопрос, попробуйте
show_all()
показать виджет и все его дочерние элементы. Если вы не скрываете и не показываете разные виджеты, проще всего вызватьshow_all
в окне верхнего уровня после того, как все определено.