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

Fragen zu Tkinter.
Antworten
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

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.
mawe
Python-Forum Veteran
Beiträge: 1209
Registriert: Montag 29. September 2003, 17:18
Wohnort: Purkersdorf (bei Wien [Austria])

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
Redprince
User
Beiträge: 128
Registriert: Freitag 22. Oktober 2004, 09:22
Wohnort: Salzgitter
Kontaktdaten:

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 ;)
sirroseide
User
Beiträge: 14
Registriert: Montag 31. Januar 2005, 15:44
Wohnort: Berlin

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.
Tux
User
Beiträge: 70
Registriert: Freitag 8. November 2002, 23:07
Kontaktdaten:

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
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

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)
Gruß!
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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)
	
Benutzeravatar
Michael Schneider
User
Beiträge: 569
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Brandenburg

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
Diese Nachricht zersört sich in 5 Sekunden selbst ...
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
pyStyler
User
Beiträge: 311
Registriert: Montag 12. Juni 2006, 14:24

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.
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.
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

[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]
Gruß!
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()
# ...
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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).
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
C4S3
User
Beiträge: 292
Registriert: Donnerstag 21. September 2006, 10:07
Wohnort: Oberösterreich

Oh, dankeschön.

Code: Alles auswählen

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

:D
Gruß!
Rock_Jacy
User
Beiträge: 3
Registriert: Freitag 14. September 2007, 07:33
Wohnort: Köln
Kontaktdaten:

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!
Räschdchraipfela dinen ßuhr undahalldunk?
sechsrad
User
Beiträge: 173
Registriert: Montag 31. März 2008, 17:09

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.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

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.
Antworten