2009-05-05 3 views
1

Ich habe eine Python-GUI-App in den Arbeiten, die ich auf Windows und Mac verwenden möchte. Die Dokumentation über Tkinter ist nicht die beste, und Google-Fu hat mich im Stich gelassen.Warum bricht Pythons Tkinter mit canvas.create_image?

Kurz

, ich tue:

c = Canvas(
    master=frame, 
    width=settings.WINDOW_SIZE[0], 
    height=settings.WINDOW_SIZE[1], 
    background=settings.CANVAS_COLOUR 
) 
file = PhotoImage(file=os.path.join('path', 'to', 'gif')) 
c.create_bitmap(position, image=file) 
c.pack() 
root.mainloop() 

Wenn ich die create_bitmap Zeile aus kommentieren, die App zieht in Ordnung. Wenn ich es wieder in Kommentar, bekomme ich folgende Fehlermeldung:

_tkinter.TclError: unknown option "-image"

Welche ungerade ist. Tkinter ist in Ordnung, entsprechend den Python-Tests (dh Import von _tkinter, Tkinter und Tk()). Ich habe seither PIL gegen mein Windows-Setup installiert (XP SP3, Python 2.6) und mir vorgestellt, dass es einiges an Heavy Lifting auf niedrigem Niveau macht. Es scheint nicht zu sein; Ich bekomme immer noch den oben genannten Fehler.

Der vollständige Stacktrace, ohne den Code Ich habe bereits eingefügt ist:

File "C:\Python26\lib\lib-tk\Tkinter.py", line 2153, in create_bitmap 
return self._create('bitmap', args, kw) 
File "C:\Python26\lib\lib-tk\Tkinter.py", line 2147, in _create 
*(args + self._options(cnf, kw)))) 

Wer in der Lage jedes Licht zu vergießen?

+0

Bevor Sie weitermachen, haben Sie Ihre App bereits auf einem Mac ausprobiert? Ich habe einmal eine Tkinter-App auf Linux gemacht, die mir Alpträume bescherte, als ich sie auf Mac portieren musste: Sie lief unter X (kein nativer Aqua-Support für Tkinter), hatte Tonnen von Bugs, die es auf der Linux-Version und einmal nicht gab es funktionierte es sah aus wie sh ** Tkinter ist schlecht dokumentiert, die Befehlszeile orientierte API macht es ein Schmerz zu debuggen, und nach meiner Erfahrung ist es nicht tragbar. Mach dir einen Gefallen und schreibe deine App mit PyQt4 oder wxWindows (ich würde PyQt4 für die objektorientierte API und großartige Dokumentation empfehlen) –

+0

Es ist sicherlich etwas, das ich in Erwägung ziehe, an dieser Stelle. Letztendlich ist die App, die ich schreibe, eine kleine Sache, um sich an Tk als Fenster-App zu gewöhnen. Ich habe schon mal mit Wx gebastelt. Ich kann am Ende Qt oder Wx für größere Projekte verwenden. –

+0

Nachtrag: Habe es gestern auf meinem Mac getestet (in seiner "Arbeitsform"). Funktioniert gut. So weit, ist es gut. –

Antwort

4

Tk hat zwei Arten von Grafiken, Bitmap und Bild. Bilder kommen in zwei Geschmacksrichtungen, Bitmap und Foto. Bitmaps und Bilder vom Typ Bitmap sind nicht dasselbe, was zu Verwirrung in den Dokumenten führt. PhotoImage erstellt ein Bild vom Typ Foto und benötigt ein Bildobjekt in der Zeichenfläche. Die Lösung besteht also, wie Sie bereits festgestellt haben, in create_image.

2

Kurze Antwort: Verwenden Sie create_bitmap nicht, wenn Sie create_image verwenden möchten.

0

Die create_bitmap() Methode hat kein image Argument; es hat stattdessen ein bitmap Argument.

Der Fehler, den Sie bekommen, kommt von der Tatsache, dass in Tkinter ein Tcl-Interpreter eingebettet in den Python-Prozess läuft und alle GUI-Interaktionen zwischen Python und Tcl hin und her gehen; Der Fehler, den Sie bekommen, kommt daher, dass Tcl antwortet: "Ich kenne keine -Image-Option im .create_bitmap-Aufruf".

In jedem Fall, wie Jeff sagte, möchten Sie wahrscheinlich die create_image Methode.