Question

Pour mon propre bénéfice et peut-être à des fins éducatives, je voudrais faire une API comme pygame pour Python et Le Caire. Mais je ne veux pas que ce soit exactement pygame. Je voudrais plutôt que d'en faire une plate-forme de dessin semi-statique afficher une ou plusieurs images en utilisant GTK / GDK, et je voudrais imiter les excellents principes de l'API de Tikz (le paquet de latex). L'API PyGame est pas mal, mais je ne suis pas satisfait. Une question particulière est que je voudrais que le paquet de rafraîchissement de la fenêtre de la poignée par tout dessin dans un pixbuf (avec le Caire), et redessiner automatiquement le pixbuf lorsque la fenêtre est découverte. De cette façon, le programmeur final n'a pas à se soucier de rafraîchissement de la fenêtre. En fait, le programmateur d'extrémité ne devrait pas avoir à faire une seule classe ou de la fonction ou pas plus d'une séquence linéaire de lignes de code pour dessiner un smiley (de par exemple). La bibliothèque graphique ne dispose pas non plus de maintenir une liste toujours plus d'objets de forme stockés comme cela est le cas dans TkInter. (Au moins, je l'espère que Le Caire ne le fait pas contre mes intentions.)

Je parvins à dessin différentes choses pycairo avec sortie à ImageMagick et Postscript. Je suis donc d'accord avec lui-même pycairo.

Malheureusement, le caire / gtk / pycairo / pygtk documentation que je trouvais --- Je ne sais pas qui il est écrit pour, mais pas pour moi. À l'heure actuelle, je suis un type Euler projet de programmeur, pas un type de programmeur « 5 bord de saignement API ultra-orienté objet ». Je voudrais voir une explication claire de ce qu'il faut faire, et / ou un bon exemple.


D'accord, j'ai accepté la réponse qui a été publié parce qu'il était au moins un peu utile. Mais ici, en un mot est le point réel. Le point est que GDK faire un double temporaire tampon lorsque vous dessinez les choses dans GDK, y compris l'utilisation du Caire. Il est prévu que lorsque vous gérez un événement exposé, il vous suffira tout redessiner. Mais si vous avez une image très compliquée, c'est un processus lent, en particulier en Python. Donc, il serait beaucoup plus agréable si le Caire pourrait écrire un double permanent tampon plutôt que temporaire, et que le double tampon permanent serait exposé avec GDK. Plusieurs développeurs ont voulu une solution à ce problème. L'un des projets qui semble avoir une sorte de solution est Google Chrome --- avez-vous déjà remarqué à quel point l'exposition fenêtre est dans Google Chrome, par exemple sous Linux? Je vais donc regarder le code source de chrome pour voir si je peux le faire facilement.

Addendum: Je vois que je l'ai fait embrouiller la question en se référant spécifiquement aux « pixbufs ». Je ne me soucie pas vraiment pixbufs (et je l'ai changé à nouveau le titre de la question). Ce que je tiens vraiment à se créer un tableau à double pixel tampon permanent entre Le Caire et GTK / GDK, au lieu d'un tableau à double pixel tampon temporaire. Il semble que la meilleure façon de le faire est de rendre la fenêtre GTK une surface du Caire et de faire le tampon double une autre surface du Caire. Depuis que j'ai demandé un échantillon dans ma question, voici quelques:

class Canvas(gtk.DrawingArea):
    def __init__(self):
        super(Canvas, self).__init__()
        self.connect("expose_event", self.expose)
        self.set_size_request(width,height)

    def expose(self, widget, event):
        cr = widget.window.cairo_create()
        cr.set_source_surface(mybuffer,0,0)
        cr.paint()

Une autre question délicate qui se pose rapidement est que je voulais que ce soit un environnement de dessin WYSISWYG qui tire immédiatement ce Python demande à dessiner --- et qui peut être étendue à des animations. Cependant, la plupart des exemples de GTK ne sont pas mis en place de cette façon: la gestion des événements est reportée jusqu'à ce que je soit gtk.main() d'appel. (Ou en Python, j'ai été surpris de découvrir que raw_input() vide aussi en quelque sorte la file d'attente d'événements GTK.) J'ai trouvé une bonne explication , avec des exemples Python, des alternatives à donner suite le contrôle des événements à GTK. La solution la plus simple et peut-être celui que je vais adopter est d'utiliser pour vider la mémoire tampon chaque fois que vous voulez faire:

while gtk.events_pending(): gtk.main_iteration(False)

Il y a une dernière chose que je devrai, pour vider le tampon de pixels ainsi que la mémoire tampon. Il ressemble à omanière ne le faire est window.queue_draw()

Était-ce utile?

La solution

Comme cela était trop grand pour un commentaire que j'ai ajouté cela comme une réponse.
La question est tout à fait clair. Voulez-vous dire de se demander comment le dessin à utiliser caire pour dessiner sur Gtk Widgets? Tout d'abord, il n'y a rien appelé GTK Pixbuf, je pense que vous faites référence à GDK Pixbuf. La plupart les choses de dessin dans GTK se fait à couche GDK . Si vous voulez en savoir plus sur fenêtrage, mécanisme de dessin ou de manipulation d'image que vous devriez regarder dans GDK pour plus de détails. Ces liens nous l'espérons, vous aider à obtenir un aperçu de l'interaction cairo-gdk. Bien que mon expérience avec les liaisons Python pour GTK, GDK et Le Caire est nul, mais je pense que Google vous fournira quelques bonnes ressources si vous regardez échantillon gdk-caire.
Espérons que cela aide au moins un peu!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top