Bild einfügen

Fragen zu Tkinter.
Antworten
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

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?
BlackJack

@Xfd7887a: Was bedeutet in diesem Fall „freigestellt” genau?
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Das ich nur noch das Objekt selber habe, es hat quasi keinen Hintergrund mehr (auch keinen weißen).
BlackJack

@Xfd7887a: Okay, und es ist im GIF-Format? Wenn nein, wie sieht die Fehlermeldung und der Code dazu aus.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

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.
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.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

In welches Format muss ich das ganze dann umwandeln?
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Und es kann die Bilder nicht mit Transparenz anzeigen, deshalb ja die Frage :wink:
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.
Xfd7887a
User
Beiträge: 135
Registriert: Montag 23. Juni 2014, 17:11

Png geht bei mir ohne Fehlermeldung. Und mit Gif ist der transparente Teil leider statt transparent schwarz.
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.
Ene Uran
User
Beiträge: 125
Registriert: Sonntag 17. September 2006, 20:14
Wohnort: Hollywood

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

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