Domanda

A mio vantaggio e forse per uso educativo, vorrei creare un'API simile a Pygame per Python e Cairo. Ma non voglio che sia esattamente Pygame. Vorrei invece renderlo una piattaforma di disegno semi-statica che visualizza una o più immagini usando GTK/GDK e vorrei imitare gli eccellenti principi API di Tikz (il pacchetto Latex). L'API Pygame non è male, ma non ne sono soddisfatto. Un problema particolare è che vorrei che il pacchetto gestisse l'aggiornamento della finestra attirando tutto in un pixbuf (con il cairo) e ridisegnare automaticamente il pixbuf quando la finestra viene scoperta. In questo modo il programmatore finale non deve preoccuparsi dell'aggiornamento della finestra. In effetti, il programmatore finale non dovrebbe scrivere una singola classe o funzione o non più di una sequenza dritta di righe di codice per disegnare una faccina sorridente (diciamo). Inoltre, la libreria grafica non deve mantenere un elenco sempre più lungo di oggetti di forma memorizzata come nel caso di Tkinter. (Almeno, spero che il Cairo non lo faccia contro le mie intenzioni.)

Sono riuscito a disegnare varie cose a Pycairo con l'output a ImageMagick e PostScript. Quindi sto bene con il Pycairo stesso.

Sfortunatamente, la documentazione del Cairo/GTK/Pycairo/Pygtk che ho trovato --- non so per chi sia scritto, ma non per me. Al momento, sono un tipo di programmatore di Progect Euler, non un tipo di programmatore "API a 5 bordo di sanguinamento a object". Mi piacerebbe vedere una chiara spiegazione di cosa fare e/o un chiaro esempio.


Ok, ho accettato l'unica risposta che è stata pubblicata perché è stata almeno un po 'utile. Ma qui in poche parole è il vero punto. Il punto è che GDK fa un temporaneo Doppio tampone quando disegni le cose in GDK, incluso l'uso del Cairo. Si prevede che quando gestisci un evento Expose, ridisegnerai tutto. Ma se hai un'immagine molto complicata, questo è un processo lento, specialmente in Python. Quindi sarebbe molto più bello se Cairo potesse scrivere a un permanente Doppio buffer anziché temporaneo, e quindi quel doppio tampone permanente sarebbe esposto con GDK. Diversi sviluppatori hanno desiderato una soluzione a questo problema. Uno dei progetti che sembra avere una sorta di soluzione è Google Chromium --- Hai mai notato quanto sia grande l'esposizione alla finestra in Google Chrome, ad esempio in Linux? Quindi guarderò il codice sorgente di Chromium per vedere se posso farlo facilmente.

Addendum: vedo che ho confuso il problema riferendosi specificamente a "Pixbufs". Non mi interessa davvero Pixbufs (e ho cambiato di nuovo il titolo della domanda). Quello che mi interessa davvero è la creazione di un array di pixel a doppio buffer permanente tra Cairo e GTK/GDK, anziché un array di pixel a doppio buffer temporaneo. Sembra che il modo più semplice per farlo sia rendere la finestra GTK una superficie del Cairo e rendere il doppio tampone un'altra superficie del Cairo. Da quando ho chiesto un campione nella mia domanda, ecco alcuni:

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

Un altro problema complicato che si è rapidamente sorto è che volevo che questo fosse un ambiente di disegno Wysiswyg che attira immediatamente ciò che Python gli chiede di disegnare --- e che può essere esteso alle animazioni. Tuttavia, la maggior parte degli esempi di GTK non è impostata in questo modo: la gestione degli eventi viene posticipata fino a quando non chiamino gtk.main(). (O a Python, sono stato sorpreso di scoprirlo raw_input() anche in qualche modo scarica la coda dell'evento GTK.) Ho trovato Una bella spiegazione, con esempi di Python, di alternative al controllo degli eventi a GTK. La soluzione più semplice e forse quella che adotterò è usarlo per eliminare il buffer di eventi ogni volta che vuoi farlo:

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

C'è un'ultima cosa di cui avrò bisogno, per scaricare il buffer pixel e il buffer di eventi. Sembra un modo per farlo window.queue_draw()

È stato utile?

Soluzione

Dato che questo era troppo grande per un commento, l'ho aggiunto come risposta.
La domanda non è del tutto chiara. Intendi chiedere come usare il disegno del Cairo per attirare i widget GTK? In primo luogo, non c'è nulla chiamato GTK Pixbuf, penso che ti riferisca a GDK Pixbuf. La maggior parte delle cose da disegno in GTK è eseguita a GDK strato. Se vuoi scoprire il finestrino, il meccanismo di disegno o la manipolazione dell'immagine, dovresti guardare a GDK per maggiori dettagli. Queste link Spero che ti aiuterà a ottenere alcune informazioni sull'interazione Cairo-GDK. Sebbene la mia esperienza con i binding Python per GTK, GDK e Cairo siano zero, ma penso che Google ti fornirà alcune buone risorse se cerchi il campione GDK-Cairo.
Spero che questo aiuti almeno un po '!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top