Как расширить класс PyGobject при необходимости создания экземпляра с альтернативной подписью? - PullRequest
0 голосов
/ 21 февраля 2019

Я работаю с Gtk.TextView в проекте, и мне нужно изменить способ создания экземпляра объекта, чтобы я мог включить собственный TextBuffer в TextView.

В настоящее время мой соответствующий код:

# Relevant code only
class EditBox(Gtk.TextView):

    __gsignals__ = {
        # some signals
    }

    def __init__(self):
        super().__init__()

Этот класс до сих пор работает и отлично работает.Изменения, которые я хотел бы внести, заставили меня использовать подпись new_with_buffer, как описано здесь .Простая передача буфера в оператор super не решает проблему, а создание / вызов super.add_with_buffer () также вызывает ошибки.

Мне нужно иметь возможность расширить свой EditBox таким образом, чтобыЯ могу создать его экземпляр, используя метод new_with_buffer в родительском объекте, или иметь возможность использовать super таким образом, чтобы он правильно создавал экземпляр таким, какой он есть.Мне не нужно иметь возможность создавать экземпляры без буфера после внесения этого изменения.

Я могу создать экземпляр самого TextView с помощью метода new_with_new и передать его в буфер, но я не могу показатьсячтобы понять, как расширить класс TextView таким образом, чтобы я мог передать буфер в свой собственный расширенный класс и передать его родителю.

Как это сделать?

1 Ответ

0 голосов
/ 22 февраля 2019

Передача kwargs конструктору суперкласса и предоставление свойства buffer в качестве параметра конструктору делает то же самое, что и использование new_with_buffer.new_with_buffer, вероятно, существует только в качестве вспомогательной функции для программистов на Си.

С привязками на основе PyGObject вы можете передать свойства в конструктор, с помощью которого они будут инициализированы.

class EditBox(Gtk.TextView):
    …
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        # do extra stuff

my_edit_box = EditBox(buffer=my_shared_buffer)
...