3

我正在尝试使用 Python 为我的自定义小部件在 GTK中实现高度宽度几何管理。我的小部件是 Image 的子类,Gtk.DrawingArea并绘制了 Image 的某些部分。

据我了解 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 中完成的?

4

1 回答 1

4

您必须将方法命名为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()

请注意,您还必须返回虚拟方法要求您返回的值,否则您将得到一个神秘的错误。

于 2012-02-29T12:21:16.027 回答