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

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

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

Beitragvon Redprince » Sonntag 28. November 2004, 14:48

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

Beitragvon mawe » Sonntag 28. November 2004, 15:10

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:

Beitragvon Redprince » Sonntag 28. November 2004, 15:24

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

Dumme Frage

Beitragvon sirroseide » Montag 31. Januar 2005, 16:06

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

Beitragvon Tux » Samstag 16. Dezember 2006, 18:21

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

Beitragvon C4S3 » Samstag 16. Dezember 2006, 20:47

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

Beitragvon pyStyler » Samstag 16. Dezember 2006, 23:02

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: 567
Registriert: Samstag 8. April 2006, 12:31
Wohnort: Bremen
Kontaktdaten:

Beitragvon Michael Schneider » Dienstag 19. Dezember 2006, 10:36

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

Beitragvon pyStyler » Dienstag 19. Dezember 2006, 11:41

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.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Dienstag 19. Dezember 2006, 17:54

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

Beitragvon pyStyler » Mittwoch 20. Dezember 2006, 10:56

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

Beitragvon BlackJack » Mittwoch 20. Dezember 2006, 14:31

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

Beitragvon C4S3 » Mittwoch 20. Dezember 2006, 15:29

[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

Beitragvon BlackJack » Mittwoch 20. Dezember 2006, 16:09

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()
# ...
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Mittwoch 20. Dezember 2006, 17:37

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 Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder