Seite 1 von 1

Bild (*.jpg, *.bmp oder *.gif) darstellen funktioniert nicht

Verfasst: Sonntag 28. November 2004, 14:48
von Redprince
Moinsen...
Ich versuche ein Bild mit Tkinter darzustellen. Das Bild (200x200px) habe ich selber mit Paint erstellt (mit den Endungen *.jpg, *.bmp und *gif). In der Dokumentation sind mir mehrere Möglichkeiten begegnet:

Code: Alles auswählen

BitmapImage(): TclError: format error in bitmap data
PhotoImage(): TclError: couldn't recognize data in image file
Ich habe einmal die *.bmp-Version und einmal die *.gif-Version probiert, die Fehler bleiben die selben.
Ich habe es immer über PythonWin versucht:

Code: Alles auswählen

from Tkinter import *
root = Tk()
BitmapImage()/PhotoImage()
Ich habe jeweils die Option 'file' mit einer bestehenden Datei versehen.

Liegt es tatsächlich an fehlerhaften Bilddateien (habe leider nur Paint auf dem Rechner), oder ist Fehlerhafter Code von mir oder ein bekannter Bug schuld?

Vielen Dank schon jetzt.

Verfasst: Sonntag 28. November 2004, 15:10
von mawe
Hi!

Das hat's vor kurzem schon mal gegeben, hier. Damals hat bmp nicht funktioniert, gif dann aber schon. Ob's an deinem Code liegt ist irgendwie schwer zu sagen, dafür hast Du zu wenig gepostet :wink:.

Gruß, mawe

Verfasst: Sonntag 28. November 2004, 15:24
von Redprince
Moinsen...
Oh, danke für den Link, hatte ich bei der Boardsuche nicht entdeckt, tut mir Leid!
Mit dem imghdr.what() habe ich dann rausgefunden, dass alle drei Dateien nur Bitmaps waren. Wenn ich mit einem anderen Programm die *.bmp in eine *.gif konvertiere kann ich mit PhotoImage() das Bild laden.
Vielen Dank für deine Hilfe, hätte ich so nicht herausbekommen ;)

Dumme Frage

Verfasst: Montag 31. Januar 2005, 16:06
von sirroseide
Da die vorangegangene Frage geklärt wurde mach ich mal gleich weiter mit was ähnlichem.

Wie verwendet(benutzt) man Bilder(bitmap usw.) mit Tkinter? :oops:

Bitte nicht wundern.

Verfasst: Samstag 16. Dezember 2006, 18:21
von Tux
Hi @ll,

ich hab genau das gleiche Problem wie Redprince und der Link von mawe führt zu nem 500-er Error...

Hilfe!!!

Danke...
Tux

Verfasst: Samstag 16. Dezember 2006, 20:47
von C4S3
Hm, also soweit ich weiss, kann Tkinter _nur_ GIF und PGM lesen. Braucht man dazu nicht noch extra PIL oder PIX oder sowas?
(kann aber sein, dass ich mich irre)

Verfasst: Samstag 16. Dezember 2006, 23:02
von pyStyler
hi,

Code: Alles auswählen

#! /usr/bin/python
#zuerst die PIL Libarary laden (hier der Link unten)
#http://www.pythonware.com/products/pil/
from Tkinter import *
from ImageTk import PhotoImage 

def makeImage(bild, master):
	img = PhotoImage(file=bild )
	L = Label(root, image=img)
	L.config(width=img.width(), height=img.height())
	L.pack( )
	master.mainloop()
	
if __name__=='__main__':
	root=Tk()
	makeImage('showpix.jpg', root)
	

Verfasst: Dienstag 19. Dezember 2006, 10:36
von Michael Schneider
Hi,

um hier mal Klärung in die Sache zu bringen:

Tkinter.PhotoImage != (ungleich) ImageTk.PhotoImage!
Übrigens auch:
Tkinter.Image != (ungleich) Image (Modul)

Mit dem Tkinter PhotoImage kann man gif (und wenige unbekanntere), aber kein jpeg, tif, png, etc. laden!

Das geht nur, wenn man die Python Image Library (PIL) installiert hat. Dann kann man die Rasterdaten direkt mit ImageTk.PhotoImage laden. Will man die Bilder vorher bearbeiten (schärfen, vergrößern, zurechtschneiden, ...), sollte man sie per

Code: Alles auswählen

img = Image.open(BildDateiName)
laden.

Nochmal eine ausdrückliche Warnung für Sternchenimportierer:

Code: Alles auswählen

from Tkinter import *
from ImageTk import PhotoImage
import Image
Tkinter.* vor PhotoImage und Image importieren, da die Namen sonst mit Tkinterobjekten überschrieben werden!

Grüße,
der Michel

Verfasst: Dienstag 19. Dezember 2006, 11:41
von pyStyler
Michael Schneider hat geschrieben:Hi,
Nochmal eine ausdrückliche Warnung für Sternchenimportierer:

Code: Alles auswählen

from Tkinter import *
from ImageTk import PhotoImage
import Image
Tkinter.* vor PhotoImage und Image importieren, da die Namen sonst mit Tkinterobjekten überschrieben werden!
Im Prinzip hast du Recht.
In diesem Fall ist es echt nicht von bedeutung wie man seine Module importiert.
from Tkinter import * ist fast normal würde ich sagen.

Verfasst: Dienstag 19. Dezember 2006, 17:54
von Leonidas
pyStyler hat geschrieben:from Tkinter import * ist fast normal würde ich sagen.
... und dennoch verpönt, weil man eben Namespaces hat, die sich gut dazu eigenen Ordnung im Quelltext zu halten.

Verfasst: Mittwoch 20. Dezember 2006, 10:56
von pyStyler
Leonidas hat geschrieben:
pyStyler hat geschrieben:from Tkinter import * ist fast normal würde ich sagen.
... und dennoch verpönt, weil man eben Namespaces hat, die sich gut dazu eigenen Ordnung im Quelltext zu halten.
Es tut mir leid,
aber sämtliche Bücher die ich über Python gelesen habe,
sind der Meinung, dass from Tkinter import * vollkommen ok ist. Von verpönt oder der gleichen hat bis jetzt noch niemand geschrieben.
Ich lasse mich gerne eines Besseren belehren.

Verfasst: Mittwoch 20. Dezember 2006, 14:31
von BlackJack
Dann sei hiermit eines besseren belehrt. Es ist einfach schlechter Stil. Du holst damit 189 Namen in das Modul und benutzt nur einen Bruchteil davon.

Der Sternchenimport ist in der interaktiven Shell nützlich weil man Tipparbeit spart, aber in Quelltexten sollte man sich das bisschen Mehraufwand geben um potentiellen Problemen aus dem Weg zu gehen.

Verfasst: Mittwoch 20. Dezember 2006, 15:29
von C4S3
[ot]
Ich kenne ehrlich gesagt auch "from Tkinter import", aber wie dann?

Sollte man dann jede benutzte Klasse einzeln importieren?

Code: Alles auswählen

from Tkinter import Tk
from Tkinter import Frame
from Tkinter import Label
Oder reicht ein einfaches

Code: Alles auswählen

import Tkinter
""" Wobei dies ja wieder alles importiert, oder?"""
Ich als hilflos in den Weiten der Namespaces treibender Neuling stehe da auch daneben - lasse mich aber gerne belehren!
Danke.
[/ot]

Verfasst: Mittwoch 20. Dezember 2006, 16:09
von BlackJack
C4S3 hat geschrieben:Ich kenne ehrlich gesagt auch "from Tkinter import", aber wie dann?

Sollte man dann jede benutzte Klasse einzeln importieren?

Code: Alles auswählen

from Tkinter import Tk
from Tkinter import Frame
from Tkinter import Label
Das kann man auch auf einer Zeile schreiben.

Code: Alles auswählen

from Tkinter import Tk, Frame, Label
Oder reicht ein einfaches

Code: Alles auswählen

import Tkinter
""" Wobei dies ja wieder alles importiert, oder?"""
Importiert wird immer alles. Die Frage ist was im Modul wo die ``import``-Anweisung steht, an Namen gebunden wird. Hier wird nur ein einziger Name, nämlich `Tkinter`, an das importierte Modul gebunden.

Ich benutze meistens diese Art, kürze aber den Modulnamen um Tipparbeit zu sparen:

Code: Alles auswählen

import Tkinter as tk

#...
root = tk.Tk()
# ...

Verfasst: Mittwoch 20. Dezember 2006, 17:37
von Leonidas
C4S3 hat geschrieben:Ich kenne ehrlich gesagt auch "from Tkinter import", aber wie dann?
Guck dir mal die Seite [wiki]Import[/wiki] an. Dort ist sogar explizit ein Tkinter-Beispiel drin, wie man es ab saubersten löst (was, oha, identisch mit dem von BlackJack angebotenen Code ist).

Verfasst: Mittwoch 20. Dezember 2006, 17:40
von C4S3
Oh, dankeschön.

Code: Alles auswählen

import Tkinter as tk
, das gefällt mir sehr gut.

:D

Verfasst: Donnerstag 10. April 2008, 22:42
von Rock_Jacy
ich habe versucht aus euren problemen und antworten schlau zu werden, bin aber gescheitert.
ich habe ein eigentlich gleiches problem, nur bin ich sehr frisch in python und nicht wirklich weit entwickelt.
ich würde auch gerne bilder in ein wedget packen. aber bei mir kommt immer eine andere fehlermeldung. egal, was ich versuche.
momentan ist die haupt-fehlermeldung, dass ...naja. seht selbst:

Code: Alles auswählen

Exception in Tkinter callback
Traceback (most recent call last):
  File "C:\Python25\lib\lib-tk\Tkinter.py", line 1403, in __call__
    return self.func(*args)
  File "C:\Python25\lib\idlelib\MultiCall.py", line 151, in handler
    r = l[i](event)
  File "C:\Python25\lib\idlelib\ScriptBinding.py", line 168, in run_module_event
    interp.runcode(code)
  File "C:\Python25\lib\idlelib\PyShell.py", line 699, in runcode
    self.interp.restart_subprocess()
AttributeError: ModifiedInterpreter instance has no attribute 'interp'
nun ja. und hier der python-code:

Code: (python)

Code: Alles auswählen

import Tkinter as tk
import os


fenster_1 = tk.Tk()
fenster_1.title('Foto')

#canvas in neuem Fenster
f1 = tk.Canvas(fenster_1,bg='white',bd=2,width=500,height=500)
photo = PhotoImage(file='C:\Dokumente und Einstellungen\kleine-Nudel\Eigene Dateien\Eigene Bilder\Liebe\Strandkinder.gif')
f1.create_image(300,280, image=img, anchor=CENTER)

f1.pack()

fenster_1.mainloop()
zur info: ich habe die Python Image Library mir schon gedownloadet. dennoch will es die bilder nicht anzeigen.

Danke, schonmal im Vorraus!

Verfasst: Freitag 11. April 2008, 15:13
von sechsrad
also wenn es bei thinker um bilder geht mit jpg,png,bmp. ist es der letzte dreck. habe es auch schon versucht. bekomme keine drehung hin während der laufzeit und keine transparent.
thinker ist auf den stand von ca 2004 und es wird nicht mehr erweitert, das es jemals diese bilder ansprechen kann.

ich bin jetzt auf wxpython umgestiegen mit intrigierten pygame-anteil.

habe die faxen dicke.

Verfasst: Freitag 11. April 2008, 15:25
von numerix
Schau dir deinen Quelltext nochmal in Ruhe an - dann merkst du selbst, dass da mehrere Dinge nicht stimmen können. Du brauchst zum Anzeigen einer gif-Datei im Übrigen weder PIL noch os.

Tipps:
- Die Klasse PhotoImage kommt aus dem Tkinter-Modul. Woher weiß das Programm das?
- Die Konstante CENTER ebenfalls.
- Als image wird beim Darstellen mit create_image eine Variable img angegeben. Wo ist die?

Wenn du das reparierst, dann läuft es.