Переопределение виртуальных методов в PyGObject - PullRequest
3 голосов
/ 29 февраля 2012

Я пытаюсь реализовать Управление высотой по ширине в GTK с Python для моего пользовательского виджета.Мой виджет является подклассом Gtk.DrawingArea и рисует некоторые части изображения.

Как я понял, документы GTK (ссылка выше), я должен реализовать следующие 4 метода:

  • GtkWidgetClass.get_preferred_width ()
  • GtkWidgetClass.get_preferred_height ()
  • GtkWidgetClass.get_preferred_height_for_width ()
  • 1014 *1014* 101 * * для6)где реализовать это в Python.

    Я пробовал это:

    from gi.repository import Gtk
    class Patch(Gtk.DrawingArea):
      def __init__(self, model, image, position):
        super(Patch,self).__init__()
        #…
    
      def get_preferred_width(self, *args, **kargs):
        print("test")
    
      def get_preferred_height(self, *args, **kargs):
        print("test")
    
      def get_preferred_width_for_height(self, *args, **kargs):
        print("test")
    
      def get_preferred_height_for_width(self, *args, **kargs):
        print("test")
    

    Но методы не вызываются.В C вы определяете функции и устанавливаете виджет следующим образом:

    static void
    my_widget_get_preferred_height (GtkWidget *widget, gint *minimal_height,
                                    gint *natural_height)
    {
      /* ... */
    }
      /* ... */
    
    static void
    my_widget_class_init (MyWidgetClass *class)
    {
      /* ... */
      GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (class);
      widget_class->get_preferred_height = my_widget_get_preferred_height;
      /* ... */
    }
    

    Как это делается в Python?

1 Ответ

4 голосов
/ 29 февраля 2012

Вы должны назвать методы как do_virtual_method:

from gi.repository import Gtk
class Patch(Gtk.DrawingArea):
  def __init__(self):
    super(Patch,self).__init__()

  def do_get_preferred_width(self):
    print("test")
    return 100, 100

  def do_get_preferred_height(self):
    print("test")
    return 100, 100

win = Gtk.Window()
win.add(Patch())
win.connect('destroy', Gtk.main_quit)
win.show_all()
Gtk.main()

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

...