среда, 30 апреля 2008 г.

PyGTK. Наследование от базового класса.

При работе с PyGTK иногда возникает необходимость создавать собственные виджеты. Теоретически все просто - унаследуем свой класс от базового gtk.Widget, gtk.Container или gtk.Bin и в конструкторе вызовем конструктор класса-родителя. Но не так все просто как кажется на первый взгляд. Создадим такой класс:

mywidget.py

# -*- coding: utf-8 -*-

import gtk

class MyWidget(gtk.Widget):
"""
Класс созданный на основе gtk.Widget
"""

def __init__(self):
gtk.Widget.__init__(self)


Проверяем:


$ python
Python 2.4.5 (#2, Mar 12 2008, 00:15:51)
[GCC 4.2.3 (Debian 4.2.3-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mywidget
>>> wdg = mywidget.MyWidget()
Traceback (most recent call last):
File "<stdin>", line 1, in ?
File "mywidget.py", line 7, in __init__
gtk.Widget.__init__(self)
TypeError: cannot create instance of abstract (non-instantiable) type `GtkWidget`
>>>


Для обычного создания унаследованных классов необходимо зарегистрировать этот класс перед использованием:


mywidget.py


# -*- coding: utf-8 -*-

import gtk
import gobject

class MyWidget(gtk.Widget):
"""
Класс созданный на основе gtk.Widget
"""

def __init__(self):
gtk.Widget.__init__(self)
# Регистрируем класс как виджет GTK
gobject.type_register(MyWidget)


Проверяем:


$ python
Python 2.4.5 (#2, Mar 12 2008, 00:15:51)
[GCC 4.2.3 (Debian 4.2.3-2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import mywidget
>>> wdg = mywidget.MyWidget()
>>>