2012-07-22 6 views
5

Der Kern der Sache ist, was mache ich falsch im folgenden Codeausschnitt?Wie kann ich ein Bild in Python 3 mit tkinter/ttk anzeigen?

from tkinter import * 
    from tkinter.ttk import * 

    root = Tk() 

    myButton = Button(root) 
    myImage = PhotoImage(myButton, file='myPicture.gif') 
    myButton.image = myImage 
    myButton.configure(image=myImage) 

    root.mainloop() 

Die Fehlermeldung, die ich von idle3 ist wie folgt:

>>> 
    Traceback (most recent call last): 
     File "/home/bob/Documents/Python/tkImageTest.py", line 9, in <module> 
     myButton.configure(image=myImage) 
     File "/usr/lib/python3.2/tkinter/__init__.py", line 1196, in configure 
     return self._configure('configure', cnf, kw) 
     File "/usr/lib/python3.2/tkinter/__init__.py", line 1187, in _configure 
     self.tk.call(_flatten((self._w, cmd)) + self._options(cnf)) 
    TypeError: __str__ returned non-string (type Button) 
    >>> 

Diese Fehlermeldung mich stumped hat, habe ich einfach nicht verstehen, was es zu sagen versucht. Irgendwelche Ideen?

ich auch Vorschläge für Änderungen zu schätzen wissen würde ...

+0

BTW geprüft ich habe bereits diese Referenz http://effbot.org/tkinterbook/photoimage.htm - Sie meinen Code-Schnipsel sieht sehr ähnlich sehen! – Bobble

+0

Der Fehler scheint auf das 'myButton'-Argument zu verweisen, das an' PhotoImage() 'übergeben wurde. Ich glaube nicht, dass 'PhotoImage()' einen Verweis auf ein Widget-Objekt nimmt, so dass dies den Fehler verursachen kann. Versuchen Sie diese Zeile ohne es, wie 'MyImage = PhotoImage (file = 'myPicture.gif')' – gary

+1

@Gary, scheint es zu tun. Ich wurde durch einige der Dokumentation (und einige andere Fehler, die ich generiert hatte) in die Irre geführt, dass das 'PhotoImage' einen expliziten Verweis auf das Hauptfenster benötigt.Nach etwas mehr findling fand ich, dass der Verweis auf entweder den root oder den Button selbst durch eine andere Konfigurationsoption im 'PhotoImage' -Konstruktor wie folgt bereitgestellt werden kann:' PhotoImage (master = myButton, file = 'myFile.gif') ', aber So wie ich es geschrieben habe, sieht es für Tkinter wie ein Name aus, der eine Zeichenkette sein soll. – Bobble

Antwort

7

Der Fehler scheint das myButton Argument PhotoImage geben zu zeigen. Wie Sie in Ihrem Kommentar erwähnten, PhotoImage das Widget-Objekt als String wurde die Behandlung (es gibt mehrere Optionen vom Typ string; here eine Liste von Optionen Photobild sehen).

Ihr Code wird funktionieren, wenn Sie diese Zeile implementieren, ohne Bezugnahme auf das myButton Objekt:

myImage = PhotoImage(file='myPicture.gif') 

Ich bin nicht sicher, dass Sie den PhotoImage Konstruktor ändern müssen. Sehen Sie sich die Dokumentation PhotoImage an, um die gültigen Optionen (d. H. Ressourcennamen) für diese Klasse zu ermitteln. Unter Angabe die Hilfedatei:

Hilfe auf Klasse Photobild in Modul tkinter:

Klasse Photobild (Bild)

| Widget which can display colored images in GIF, PPM/PGM format. 
|  
| Method resolution order: 
|  PhotoImage 
|  Image 
|  builtins.object 
|  
| Methods defined here: 
|  
| __getitem__(self, key) 
|  # XXX config 
|  
| __init__(self, name=None, cnf={}, master=None, **kw) 
|  Create an image with NAME. 
| 
|  Valid resource names: data, format, file, gamma, height, palette, 
|  width. 

Zur Info: Der einfachste Weg, um die Dokumente zu erhalten aus Python in der Befehlszeile oder von IDLE:

from tkinter import PhotoImage 
help(PhotoImage) 

Und schließlich, ein anderer nützlicher Link über diese Klasse ist http://tkinter.unpythonic.net/wiki/PhotoImage.

+1

Vielen Dank Gary! Sie haben auch mit der 'Master'-Referenz recht. Das war ein hang-over von einigen Experimenten, die ich mit mehreren Threads machte (am besten nicht zu fragen!). – Bobble

+0

@Bobble BTW, wenn dies die Frage beantwortet, bitte markieren Sie es als die angenommene Antwort (das sieht etwas aus, was Sie für ein paar Ihrer Fragen tun können). – gary

-1

testete ich das Beispiel mit Python 2.7.9, 3.2.5, 3.3.5, 3.4.3 in 32bit und 64bit. (Win 8.1 64bit)

Der Code funktioniert.

(in Python 3.4.3 64bit hatte ich zum ersten Mal eine Fehlermeldung.

I 3.4.3 und dann neu installiert vollständig deinstalliert haben.

Nun arbeitet das Beispiel auch mit 3.4.3 64-Bit)

# basic code from >> 
# http://tkinter.unpythonic.net/wiki/PhotoImage 

# extra code ------------------------------------------------------------------------- 
from __future__ import print_function 

try: 
    import tkinter as tk 
except: 
    import Tkinter as tk 

import sys 
import platform 

print() 
print ('python ', sys.version) 
print ('tkinter ', tk.TkVersion) 
print() 
print (platform.platform(),' ',platform.machine()) 
print() 


# basic code ------------------------------------------------------------------------- 

root = tk.Tk() 

def create_button_with_scoped_image(): 
    # "w6.gif" >> 
    # http://www.inf-schule.de/content/software/gui/entwicklung_tkinter/bilder/w6.gif 
    img = tk.PhotoImage(file="w6.gif") # reference PhotoImage in local variable 
    button = tk.Button(root, image=img) 
    # button.img = img # store a reference to the image as an attribute of the widget 
    button.image = img # store a reference to the image as an attribute of the widget 
    button.grid() 

create_button_with_scoped_image() 

tk.mainloop() 
+0

Sind Sie sicher, dass das eine Antwort und genauer gesagt eine Antwort für python-3.x ist? – Deduplicator

+0

Eine gute Antwort ist nicht nur eine funktionierende, sondern auch eine dokumentierte Antwort. Es macht keinen Sinn, Code zu liefern, wenn das OP es nicht versteht. Er/sie sollte etwas von der Antwort lernen, anstatt es nur zu kopieren, so dass er/sie beim nächsten Mal die gleiche Frage erneut stellt, nur in einem anderen Kontext. – ShellFish

+0

der Punkt ist, dass die Antwort von Gary und das Tkinter Wiki für mich nicht funktioniert in Python 3.4.3 –

Verwandte Themen