Pregunta

Para mi propio beneficio y posiblemente para uso educativo, me gustaría hacer una API similar a Pygame para Python y El Cairo. Pero no quiero que sea exactamente Pygame. En su lugar, me gustaría convertirlo en una plataforma de dibujo semiestático que muestre una o más imágenes usando GTK/GDK, y me gustaría imitar los excelentes principios API de TIKZ (el paquete de látex). La API de Pygame no está mal, pero no estoy satisfecho con ella. Un problema en particular es que me gustaría que el paquete maneje la actualización de la ventana dibujando todo en un PixBuf (con El Cairo), y vuelva a dibujar automáticamente el PIXBUF cuando se descubre la ventana. De esa manera, el programador final no tiene que preocuparse por la actualización de la ventana. De hecho, el programador final no debería tener que escribir una sola clase o función o más de una secuencia directa de líneas de código para dibujar una cara sonriente (por ejemplo). La biblioteca de gráficos tampoco tiene que mantener una lista cada vez más larga de objetos de forma almacenada, como es el caso en Tkinter. (Al menos, espero que El Cairo no haga eso contra mis intenciones).

Logré dibujar varias cosas en Pycairo con la salida a ImageMagick y PostScript. Así que estoy de acuerdo con Pycairo.

Desafortunadamente, la documentación de El Cairo/GTK/Pycairo/Pygtk que encontré --- No sé para quién está escrito, pero no para mí. En este momento, soy un tipo de programador de Project Euler, no un tipo de programador "5 API orientadas a ultraBject orientadas al ultra objeto". Me gustaría ver una explicación clara de qué hacer y/o un ejemplo claro.


De acuerdo, acepté la única respuesta que se publicó porque al menos fue un poco útil. Pero aquí en pocas palabras es el verdadero punto. El punto es que GDK hace un temporario Buffer doble cuando dibuja las cosas en GDK, incluido el uso de El Cairo. Se espera que cuando maneje un evento de exposición, simplemente vuelva a dibujar todo. Pero si tiene una imagen muy complicada, este es un proceso lento, especialmente en Python. Entonces sería mucho mejor si El Cairo pudiera escribir a un permanente Buffer doble en lugar de uno temporal, y luego ese doble búfer permanente se expusiría con GDK. Varios desarrolladores han querido una solución a este problema. Uno de los proyectos que parece tener algún tipo de solución es Google Chromium --- ¿Alguna vez ha notado cuán grande es la exposición a la ventana en Google Chrome, por ejemplo en Linux? Así que veré el código fuente de Chromium para ver si puedo hacer esto fácilmente.

Anexo: Veo que confundí el problema refiriéndome específicamente a "PixBufs". Realmente no me importa PixBufs (y cambié el título de la pregunta nuevamente). Lo que realmente me importa es crear una matriz de píxeles de doble amortiguamiento permanente entre El Cairo y GTK/GDK, en lugar de una matriz de píxeles de doble búfer temporal. Parece que la forma más fácil de hacerlo es hacer que la ventana GTK sea una superficie de El Cairo y hacer que el doble buffer sea otra superficie de El Cairo. Como pedí una muestra en mi pregunta, aquí hay algunos:

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()

Otro problema difícil que surgió rápidamente es que quería que este fuera un entorno de dibujo de Wysiswyg que dibuja inmediatamente lo que Python le pide que dibuje, y que se puede extender a animaciones. Sin embargo, la mayoría de los ejemplos de GTK no están configurados de esa manera: el manejo de eventos se pospone hasta que llamo gtk.main(). (O en Python, me sorprendió descubrir que raw_input() También de alguna manera sonroja la cola de eventos GTK.) Encontré Una buena explicación, con ejemplos de Python, de alternativas para regalar control de eventos a GTK. La solución más simple y posiblemente la que adoptaré es usar esto para enjuagar el búfer de eventos siempre que quiera hacer eso:

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

Hay una cosa final que necesitaré, para enjuagar el búfer de píxeles y el búfer de eventos. Parece una forma de hacerlo es window.queue_draw()

¿Fue útil?

Solución

Como esto fue demasiado grande para un comentario, he agregado esto como respuesta.
La pregunta no está del todo clara. ¿Quiere preguntar cómo usar el dibujo de El Cairo para dibujar en widgets GTK? En primer lugar, no hay nada llamado GTK PixBuf, creo que se refiere a GDK PixBuf. La mayoría de las cosas de dibujo en GTK se realizan en Gdk capa. Si desea averiguar sobre la ventana, el mecanismo de dibujo o la manipulación de la imagen, debe buscar GDK para obtener más detalles. Estas Enlaces Con suerte, lo ayudará a obtener una idea de la interacción El Cairo-GDK. Aunque mi experiencia con Python Bindings para GTK, GDK y El Cairo es nulo, pero creo que Google le proporcionará algunos buenos recursos si busca la muestra de GDK-Cairo.
¡Espero que esto ayude al menos un poco!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top