在PyGObject中重写虚方法

6
我正在尝试使用Python在GTK中实现高度与宽度的几何管理,以用于我的自定义小部件。我的小部件是从Gtk.DrawingArea继承而来,并绘制图像的某些部分。
根据我理解的GTK文档(上面的链接),我需要实现以下4个方法:
  • GtkWidgetClass.get_preferred_width()
  • GtkWidgetClass.get_preferred_height()
  • GtkWidgetClass.get_preferred_height_for_width()
  • GtkWidgetClass.get_preferred_width_for_height()
现在我想知道在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中如何实现?

请注意,pyGObject已被弃用,推荐使用GObject-Introspection。 - liberforce
PyGObject不是使用Python的GObject-Introspection的方式吗?你是不是指PyGTK已经被弃用,推荐使用PyGObject? - thorink
2
@liberforce:令人困惑的是,GObject Introspection 的 Python 实现也被称为 PyGObject。它曾经被称为 PyGI,但现在似乎是官方名称。旧版的 PyGObject 是 PyGTK 的一部分,而 PyGTK 现已被弃用。(但我相信覆盖虚拟方法的方式是相同的。) - ptomato
@ptomato:哇,你说得对:http://live.gnome.org/PyGI!谢谢你的提示,我之前不知道这个。 - liberforce
1个回答

7

你需要像这样命名方法: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()

请注意,您还需要返回虚方法要求返回的值,否则可能会收到晦涩难懂的错误信息。


1
要实现高度与宽度的比例,您必须实际上重写 do_get_request_modedo_get_preferred_heightdo_get_preferred_widthdo_get_preferred_width_for_heightdo_get_preferred_height_for_width - thorink

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接