tkinter.TclError: couldnt recognize data in image file

michi@sysvorOrt ~/python $ python mit-bild.py 
Traceback (most recent call last):
  File "mit-bild.py", line 4, in <module>
    logo = PhotoImage(file="grafik.jpg")
  File "/usr/lib/python3.8/tkinter/__init__.py", line 4061, in __init__
    Image.__init__(self, 'photo', name, cnf, master, **kw)
  File "/usr/lib/python3.8/tkinter/__init__.py", line 4006, in __init__
    self.tk.call(('image', 'create', imgtype, name,) + options)
_tkinter.TclError: couldn't recognize data in image file "grafik.jpg"


Zum anzeigen von Bildern im jpg-Format wird zusätzlich das PIL-Modul (Python Image Library) benötigt. Mit dem Tkinter eigenen tk.PhotoImage lassen sich nur die Bildformate gif und png anzeigen. Mit PIL lassen sich alle Bildformate anzeigen.

tkinter Fehler und Lösungen


Eine einfache Python Datei als Beispiel:

import tkinter as tk
from tkinter import *
counter = 0 
def counter_label(label):
  def count():
    global counter
    counter += 1
    label.config(text=str(counter))
    label.after(1000, count)
  count()
 
 

Als Test benannt ist sie wie folgt aufrufbar:

michi@sysvorOrt ~/python $ python test.py 
Traceback (most recent call last):
  File "test.py", line 1, in <module>
    from tkinter import *
  File "/home/michi/python/tkinter.py", line 3, in <module>
    tkFenster = tk()
NameError: name 'tk' is not defined

Allgemeine Infos zu einem tkinter Fehler

Dieser Fehler basiert auf einen Zugriff von Python in die grafische Oberfläche (GUI). Tkinter ist ein Teil zur Erstellung einer grafischen Oberfläche in der Programmiersprache Python.

Um Python zu nutzen muss die Programmiersprache mit dem USE-Flag tk kompiliert werden. Durch eselect kann die gewünscht Python Version festgelegt werden.

Installieren

Um tkinter zu erhalten, setzen Sie das Use-Flag tk für dev-lang / python:

Bearbeiten Sie /etc/portage/package.use
Setzen Sie das USE-Flag, indem Sie eine neue Zeile für Python hinzufügen:
dev-lang / python tk

in der Vergangenheit war die Flagge für Tkinter tcltk

Python neu kompilieren

sysvorOrt /home/michi/python # eselect python list
Available Python interpreters, in order of preference:
[1] python3.7
[2] python3.8 (fallback)
[3] python2.7 (fallback)
sysvorOrt /home/michi/python # python3.8
Python 3.8.5 (default, Oct 19 2020, 20:18:09)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.


Welche Version installiert ist kann durch den Aufruf von Python in der Kommandozeile nachgeschaut werden. In diesem Fall 3.8.5:


sysvorOrt /home/michi/python # python
Python 3.8.5 (default, Oct 19 2020, 20:18:09)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.

Dann gab es noch solch einen doofen Fehler von mir. Um tkinter zu nutzen muss es natürlich importiert werden.

>>> tkinter
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'tkinter' is not defined
>>> import tkinter
>>> 

Ein Beispiel für einen Fehler in Bezug auf tkinter:

michi@sysvorOrt ~/python $ python uebung1.py 
Traceback (most recent call last):
  File "uebung1.py", line 1, in <module>
    import tkinter as tk
  File "/home/michi/python/tkinter.py", line 3, in <module>
    tkFenster = tk()
NameError: name 'tk' is not defined

Durch die Ausführung von #python -m tkinter kann überprüft werden ob tk erfolgreich installiert wurde und genutzt werden kann. Bei erfolgreicher Konfiguration wird folgendes Bild angezeigt:

Damit tkinter funktioniert muss das .py Programm in dem Arbeitsverzeichnes des Python ausgeführt werden. In diesem Fall ist es das Root Verzeichnis und wird auf /home/michi/python egändert. Bitte beachten: diese Änderung ist nur während der Session aktiv. Das Arbeitsverzeichnis wird wie folgt abgerufen und ggf. temporär geändert:

sysvorOrt / # python
Python 3.8.5 (default, Oct 26 2020, 17:00:05)
[GCC 9.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import os
>>> os.getcwd()
'/'
>>> os.chdir ("/home/michi/python")
>>> os.getcwd()
'/home/michi/python'
>>> 

tkinter wird je nach Python – Version unterschiedlich geschrieben: Bei Verwendung von Python 2.x.: Verwenden Sie import Tkinter
Verwenden von Python 3.x: Verwenden Sie import tkinter (beachten Sie den Kleinbuchstaben T).
https://wiki.gentoo.org/wiki/Tkinter