2016-03-24 4 views
1

Je suis le mainteneur de GPSD. Ayant appris que les bindings de gobject pour pygtk sont obsolètes, j'essaye de rediriger le portage de nos clients de test Python vers python-gi. J'ai porté des xgps avec peu de difficulté en utilisant le pygi-convert.sh script, mais j'ai maintenant un problème avec xgpsspeed. Après avoir exécuté pygi-convert.sh sur xgpsspeed, je dois d'abord corriger manuellement le signal "expos_event", en le remplaçant par "draw". Je m'y attendais, comme je devais faire la même chose dans le port xgps réussi.Champ de contexte du Caire inconnu lors du portage vers python-gi

L'exécution de la version patchée jette cette erreur:

Traceback (most recent call last): 
    File "./xgpsspeed", line 72, in draw 
    event.area.x, 
AttributeError: 'cairo.Context' object has no attribute 'area' 

qui se rapporte clairement à cette section de code dans le gestionnaire de méthode:

def draw(self, _unused, event, _empty=None): 
    self.cr = self.get_window().cairo_create() 
    self.cr.rectangle(
     event.area.x, 
     event.area.y, 
     event.area.width, 
     event.area.height 
    ) 

Ma recherche-fu ne tourne pas en raison apparente pour que l'argument event soit passé un contexte Cairo sous 3.x plutôt que l'événement attendu et obtenu sous 2.x. Je peux seulement deviner que la signature du gestionnaire a changé, mais je ne trouve aucune documentation qui traite la question.

Répondre

2

Répondez à ma propre question, pour toute personne qui trouve cela via la recherche Google.

Oui, la méthode draw prend une signature différente dans 3.x. Cette signature inclut un contexte Cairo mais pas l'événement d'exposition Gdk comme dans 2.x.

j'ai pu passer à l'étape suivante en créant un gestionnaire pour l'événement d'allocation sizer:

def on_size_allocate(self, _unused, allocation): self.width = allocation.width self.height = allocation.height

puis écrire le rectangle dessiner comme

self.cr.rectangle(0, 0, self.width, self.height)

De cette façon Je n'avais plus besoin du contenu de l'événement d'exposition. Cependant, l'insertion de 0 pour les arguments x, y était juste une supposition que la méthode prend des coordonnées relatives et pourrait être subtilement erronée.

La documentation sur ce genre de choses est terrible.