问题
I'm trying to implement the Heigh-for-width Geometry Management in GTK with Python for my custom Widget. My widget is a subclass from Gtk.DrawingArea
and draws some parts of an Image.
As I understood the GTK Docs (link above) I have to implement the following 4 methods:
- GtkWidgetClass.get_preferred_width()
- GtkWidgetClass.get_preferred_height()
- GtkWidgetClass.get_preferred_height_for_width()
- GtkWidgetClass.get_preferred_width_for_height()
Now wondering where to implement this in Python.
I tried this:
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")
But the methods don't get called. In C you define the functions and set it to the widget like this:
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;
/* ... */
}
How is this done in Python?
回答1:
You have to name the methods like 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()
Note that you also have to return the values that the virtual method requires you to return, otherwise you'll get a cryptic error.
来源:https://stackoverflow.com/questions/9496322/overriding-virtual-methods-in-pygobject