2016-10-22 6 views
4

Je suis en train de porter un script Python2 qui utilise Pango pour dessiner du texte sur une surface Cairo. Cela fonctionne très bien en utilisant l'ancienne API PyGtk avec le package pangocairo. Mon système (Debian Jesse) n'a pas de paquets Python3 pour PyGtk et utilise plutôt les nouvelles bibliothèques Gtk + avec l'API PyGObject.Utilisation de PangoCairo avec l'API PyGObject

Je souhaite créer un objet pangocairo.CairoContext mais il semble manquer dans la nouvelle API. Le package PangoCairo a une fonction create_context() mais génère un objet PangoContext qui ne possède pas les méthodes dont j'ai besoin.

Jusqu'à présent, j'ai ceci:

import cairo 
from gi.repository import Pango 
from gi.repository import PangoCairo 

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) 
ctx = cairo.Context(surf) 
pctx = PangoCairo.create_context(ctx) # Creates a PangoContext 
pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL) # This fails 

L'ancien code python2 qui fonctionne:

import cairo 
import pango 
import pangocairo 

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) 
ctx = cairo.Context(surf) 
pctx = pangocairo.CairoContext(ctx) 
pctx.set_antialias(cairo.ANTIALIAS_SUBPIXEL) 

Quelqu'un at-il une solution pour cela? Y at-il une bonne documentation sur la façon dont PangoCairo devrait être utilisé avec la nouvelle API?

Répondre

4

Il semble que la bibliothèque a été réarrangée un peu. Le contexte Pango (maintenant Pango.Context) est récupéré à partir de l'objet Pango.Layout maintenant. Voici une solution de travail:

import cairo 
from gi.repository import Pango 
from gi.repository import PangoCairo 

surf = cairo.ImageSurface(cairo.FORMAT_ARGB32, 8, 8) 
ctx = cairo.Context(surf) 
layout = PangoCairo.create_layout(ctx) 
pctx = layout.get_context() 

fo = cairo.FontOptions() 
fo.set_antialias(cairo.ANTIALIAS_SUBPIXEL) 
PangoCairo.context_set_font_options(pctx, fo) 
+0

"Le contexte Pango (maintenant Pango.Context) est récupéré à partir de l'objet Pango.Layout maintenant." Ce n'est pas la raison pour laquelle votre solution fonctionne. "pctx = PangoCairo.create_context (ctx)" fonctionnera de la même manière. Vous avez modifié le code qui définit l'anti-crénelage. – beroal