Python Gtk3 создает простой объект-контейнер с Gtk.Container

Я попытался создать базовый виджет контейнера GTK со следующим кодом:

from Gtk3Modules import *
from gi.repository.GObject import GObject

class Ex(Gtk.Container):
    pass


btn = Gtk.Button("nss")

ab = Ex()
ab.add(btn)


w = Gtk.Window()
w.add(ab)
w.show_all()

когда я запускаю этот скрипт, я получаю следующую фатальную ошибку:

(example.py:2642): Gtk-WARNING **: GtkContainerClass::add not implemented for '__main__+Ex'
**
Gtk:ERROR:gtkwidget.c:12365:gtk_widget_real_realize: assertion failed: (!_gtk_widget_get_has_window (widget))
rlwrap: warning: python3 crashed, killed by SIGABRT (core dumped).
rlwrap itself has not crashed, but for transparency,
it will now kill itself with the same signal


warnings can be silenced by the --no-warnings (-n) option
Aborted (core dumped)

person Nomad    schedule 09.09.2017    source источник


Ответы (1)


Gtk.Container - это не виджет, это интерфейс, который вы должны реализовать. Маловероятно, что это то, что вы действительно хотите сделать, поскольку реализация нового контейнера не является тривиальной задачей.

Вы, вероятно, захотите использовать Gtk.Box, если хотите, чтобы он содержал несколько дочерних элементов, или Gtk.Bin, если вам нужен только один дочерний элемент.

person TingPing    schedule 09.09.2017
comment
Gtk.Bin самый примитивный объект для добавления единственного потомка? почему вы не предложили Gtk.EventBox, потому что его можно использовать для добавления одного ребенка вместо Gtk.Bin спасибо - person Nomad; 10.09.2017
comment
Gtk.EventBox является подклассом Gtk.Bin с несколькими дополнительными функциями. Upstream предлагает Gtk.Bin: wiki.gnome.org/HowDoI/CustomWidgets - person TingPing; 10.09.2017