Seite 1 von 1

Bild einfügen

Verfasst: Samstag 21. Februar 2015, 10:47
von Xfd7887a
Ich habe ein Teil eines Bildes freigestellt und möchte dieses in Tkinter einfügen. Wenn ich das mache, erscheint es jedoch nicht im Fenster (beim nicht freigestellten geht es). Wie kann ich diesen Fehler beheben?

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 11:34
von BlackJack
@Xfd7887a: Was bedeutet in diesem Fall „freigestellt” genau?

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 11:37
von Xfd7887a
Das ich nur noch das Objekt selber habe, es hat quasi keinen Hintergrund mehr (auch keinen weißen).

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 11:38
von BlackJack
@Xfd7887a: Okay, und es ist im GIF-Format? Wenn nein, wie sieht die Fehlermeldung und der Code dazu aus.

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 11:40
von Xfd7887a
es ist im PNG-Format. Es gibt keine Fehlermeldung, es wird einfach nicht angezeigt. Stelle ich den background auf Schwarz, wird es angezeigt, aber mit einem weißen Rahmen.

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 13:29
von BlackJack
@Xfd7887a: Dein Tk kann PNGs lesen? Und das auch noch mit Transparenz? Cool. Du solltest eher nicht davon ausgehen dass das mit Tk generell funktioniert.

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 16:24
von Xfd7887a
In welches Format muss ich das ganze dann umwandeln?

Re: Bild einfügen

Verfasst: Samstag 21. Februar 2015, 18:04
von Xfd7887a
Und es kann die Bilder nicht mit Transparenz anzeigen, deshalb ja die Frage :wink:

Re: Bild einfügen

Verfasst: Sonntag 22. Februar 2015, 09:57
von BlackJack
Ich bin ja immer noch total überrascht das Du beim Versuch ein PNG zu laden nicht das hier bekommst:

Code: Alles auswählen

In [6]: p = tk.PhotoImage(file='test.png')
---------------------------------------------------------------------------
TclError                                  Traceback (most recent call last)
<ipython-input-6-f0977c0bf5f9> in <module>()
----> 1 p = tk.PhotoImage(file='test.png')

/usr/lib/python2.7/lib-tk/Tkinter.pyc in __init__(self, name, cnf, master, **kw)
   3245         Valid resource names: data, format, file, gamma, height, palette,
   3246         width."""
-> 3247         Image.__init__(self, 'photo', name, cnf, master, **kw)
   3248     def blank(self):
   3249         """Display a transparent image."""

/usr/lib/python2.7/lib-tk/Tkinter.pyc in __init__(self, imgtype, name, cnf, master, **kw)
   3201                 v = self._register(v)
   3202             options = options + ('-'+k, v)
-> 3203         self.tk.call(('image', 'create', imgtype, name,) + options)
   3204         self.name = name
   3205     def __str__(self): return self.name

TclError: couldn't recognize data in image file "test.png"
Von Haus aus versteht Tk nur GIF, PPM, und PGM als Formate und von denen hat nur GIF Transparenz. Und da auch nur 1-Bit-Transparenz, also ein Pixel ist entweder vollständig transparent oder vollständig deckend.

Um andere Formate zu laden braucht man zusätzlichen Code zum Beispiel in Form einer Bibliothek. Entweder für Tk oder auf Python-Seite. Und man muss einen Blick auf die Tk-Version werfen wenn man mehr als 1-Bit-Transparenz haben möchte, denn vor Tk 8.4 war nur das möglich.

Re: Bild einfügen

Verfasst: Sonntag 22. Februar 2015, 10:35
von Xfd7887a
Png geht bei mir ohne Fehlermeldung. Und mit Gif ist der transparente Teil leider statt transparent schwarz.

Re: Bild einfügen

Verfasst: Sonntag 22. Februar 2015, 11:36
von BlackJack
@Xfd7887a: Dann machst Du irgend etwas falsch. Da Du es erfolgreich schaffst so wenig Informationen wie überhaupt möglich zu verraten, kann man schlecht sagen was das ist.

Re: Bild einfügen

Verfasst: Samstag 7. März 2015, 16:29
von Ene Uran
Bilder mit Transparenz anzeigen kann man notwendigerweise auch so machen ...

Code: Alles auswählen

# explore Tkinter transparency (simplified)

try:
    # Python2
    import Tkinter as tk
except ImportError:
    # Python3
    import tkinter as tk

root = tk.Tk()

# use opacity alpha values from 0.0 to 1.0
# opacity/tranparency applies to image and root frame
root.wm_attributes('-alpha', 0.7)  

# use a GIF image you have in the working directory
# or give full path
photo = tk.PhotoImage(file="LAKE.gif")

tk.Label(root, image=photo).pack()

root.mainloop()


Re: Bild einfügen

Verfasst: Samstag 7. März 2015, 16:53
von BlackJack
@Ene Uran: *Das* macht jetzt aber das ganze Fenster transparent. Das ist hier ja gar nicht gefragt. Funktioniert ausserdem nicht plattformübergreifend.

Hier sollen Teile einer Grafik transparent sein, zum Beispiel um viele niedliche kleine Hoppelhäschen in einem Fenster anzuzeigen die sich teilweise verdecken, weil sie sonst nicht alle auf den Bildschirm passen. Aber eben nicht überlappende Rechtecke sondern in ”Häschenform”.