LINUX.ORG.RU

pygtk: создание потомка GtkBin


0

0

Нужен кастомный виджет состоящий из парочки примитивных виджетов. Решил сделать этот виджет потомком GtkBin, в него поместить GtkHBox, а там уже расположить требуемые примитивы.

Однако почему-то новый виджет не показывается. Код ниже. Где косяк и как исправить? Спасибо.

P.S. Если наследоваться от HBox, то все прекрасно показывается и работает — но по логике вещей HBox имеет совершенно другую семантику.

import gobject
import pygtk
pygtk.require20()
import gtk as g

class InputWidget(g.Bin):
    def __init__(self, *args):
        g.Bin.__init__(self, *args)

        self.__build()

    def __build(self):
        self.__mainLayout = g.HBox()
        self.add(self.__mainLayout)        

        self.__stateLabel = g.Label("<S>")
        self.__expandLabel = g.Label("<E>")
        self.__inputEntry = g.Entry()

        self.__mainLayout.pack_start(self.__stateLabel, False, False, 15)
        self.__mainLayout.pack_start(self.__inputEntry, True, True, 0)
        self.__mainLayout.pack_end(self.__expandLabel, False, False, 15)

gobject.type_register(InputWidget)

def main():
    w = g.Window(g.WINDOW_TOPLEVEL)
    w.connect("destroy", g.main_quit)
    w.connect("delete_event", lambda x, y: False)
    w.set_size_request(500, 200)
    w.set_border_width(10)

    main_layout = g.VBox(True)
    main_frame = g.Frame("Main Frame") 
    w.add(main_layout)
    main_layout.add(main_frame)

    frame_layout = g.VBox(True)
    main_frame.add(frame_layout)

    # This code works:
    #label = g.Label("simple label")
    #frame_layout.pack_start(label, True, True, 0)
    # But this do not:
    input = InputWidget()
    frame_layout.pack_start(input, True, True, 0)


    w.show_all()
    g.main()
★★★
Ответ на: комментарий от Deleted

Наследуйся от GtkContainer

Пробовал уже. Ошибка выполнения. И чем GtkBin плох?

./pygtk-test.py:18: GtkWarning: GtkContainerClass::add not implemented for `__main__+Input'
  self.add(self.__mainLayout)
**
** Gtk:ERROR:(/build/buildd/gtk+2.0-2.12.9/gtk/gtkwidget.c:7967):gtk_widget_real_realize: assertion failed: (GTK_WIDGET_NO_WINDOW (widget))
kondor ★★★
() автор топика
Ответ на: комментарий от kondor

Вопрос решен. Надо было доопределить в классе-наследнике следующие методы:

    def do_size_request(self, req):
        req.width, req.height = self.__mainLayout.size_request()
	
    def do_size_allocate(self, alloc):
        self.__mainLayout.size_allocate(alloc)  

Всем спасибо за внимание и помощь!

kondor ★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.