我正在尝试使用Python为我的自定义Widget实现GTK中的Heigh-for-width Geometry Management。我的小部件是Gtk.DrawingArea
的子类,并绘制了图像的某些部分。
据我了解GTK文档(上面的链接),我必须实现以下4种方法:
现在想知道在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中完成?
答案 0 :(得分: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()
请注意,您还必须返回虚拟方法要求您返回的值,否则您将收到一个神秘的错误。