web-dev-qa-db-fra.com

Python Tkinter lançant une erreur Tcl

J'apprends l'interface graphique de base en Python et je suis tombé sur un exemple pour lire le nom de fichier à partir de l'explorateur de fichiers sur Stack Overflow .

from Tkinter import Tk
from tkFileDialog import askopenfilename
Tk().withdraw() # we don't want a full GUI, so keep the root window from appearing
filename = askopenfilename() # show an "Open" dialog box and return the path to the selected file
print(filename)

Ce script particulier fonctionne correctement lorsque j'essaie de l'exécuter dans IDLE, mais ce n'est pas le cas si j'essaie avec l'invite de commande dans Windows 7.

Version Python: 2.7. Voici l'erreur de sortie que je reçois.

>>> from Tkinter import Tk
>>> from tkFileDialog import askopenfilename
>>> Tk().withdraw()
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "C:\Python27\Lib\lib-tk\Tkinter.py", line 1685, in __init__
self.tk = _tkinter.create(screenName, baseName, className, interactive, wantobjects, useTk, sync, use)
_tkinter.TclError: Can't find a usable init.tcl in the following directories:
C:/Python27/lib/tcl8.5 D:/PyProj/lib/tcl8.5 D:/lib/tcl8.5 D:/PyProj/library D:/library D:/tcl8.5.2/library D:/tcl8.5.2/library

This probably means that Tcl wasn't installed properly

N'importe quel indicateur de ce qui me manque ici peut être d'une grande aide.

9
charan

Si vous utilisez Virtualenv sous Windows, j’ai trouvé une solution ici: https://github.com/pypa/virtualenv/issues/93

J'ai copié le dossier "tcl" de C:\Python27\sur la racine du nouveau Virtualenv, Tkinter.Tk () affiche une nouvelle fenêtre sans lever d'exception.

J'exécute Python 2.7 sur Windows 7.

10
B-Axe

Hit un problème similaire après l'installation de Activestate Python et TCL. J'ai trouvé que la page suivante résolvait le problème pour moi: Problème d'installation d'ActiveState Python . Le correctif consistait à copier le contenu de C:\Python27\tcl dans C:\Python27\Lib.

Une autre solution potentielle (donnée par l'utilisateur i-shenl dans un autre thread ActiveState sur le même problème) consiste à définir la variable d'environnement $TCL_LIBRARY pour pointer vers le dossier de la bibliothèque tcl ("C:/Python27/tcl ", dans la question). Si vous définissez cette option sur l'ensemble du système ou du compte (via Propriétés système ), cela affectera les autres programmes utilisant une bibliothèque TCL (le cas échéant). Si vous utilisez Powershell, vous pouvez définir cette variable dans votre profile pour limiter ses effets aux programmes exécutés à partir du shell.

6
pav

Il vous suffit de copier deux dossiers du dossier tcl dans le dossier Lib.

tcl8.5 et tk8.5

6

Je rencontre le même problème sous Ubuntu 17.04 avec virtualenvwrapper pour Python 2.7 bits

J'ajoute les chemins de bibliothèque tk et tcl en local script postactivate

  1. Accédez à votre virtualenv: workon your-env-name
  2. Éditez le script postactive local avec votre éditeur préféré, par exemple: gedit $VIRTUAL_ENV/bin/postactivate
  3. Localisez les chemins de bibliothèque tk et tcl. Dans le script postactivate, exportez TK_LIBRARY et TCL_LIBRARY avec les chemins appropriés. Ajoutez ces lignes à votre script avec les chemins modifiés: 

    TK_LIBRARY=/home/kamil/anaconda2/pkgs/tk-8.5 TKPATH=/home/kamil/anaconda2/pkgs/tk-8.5 TCL_LIBRARY=/home/kamil/anaconda2/lib/tcl8.5 export TCL_LIBRARY TK_LIBRARY TKPATH

  4. Redémarrez votre virtualenv: deactivate et workon your-env-name à nouveau.
3
Kamil Czerski

Si vous rencontrez ce type d'erreur dans un environnement virtuel de type python -m venv NAME (et que tcl est réellement installé sur votre système), vous devez exporter les chemins de la même manière que suggéré par Kamil Czerski dans un précédent article de virtualenv .

  1. Pour savoir quels sont vos chemins TK et TCL, exécutez un script python outside of venv ( source ): 
import tkinter
root = tkinter.Tk()   
print(root.tk.exprstring('$tcl_library'))   
print(root.tk.exprstring('$tk_library'))
  1. Ouvrez votre fichier de configuration venv bin/activate et recherchez l'emplacement où ils ont export PATH, puis insérez-le (insérez les chemins d'accès appropriés à l'étape 1):
TCL_LIBRARY="/tcl/path/from/step/1"   
TK_LIBRARY="/tk/path/from/step/1"   
TKPATH="/tk/path/from/step/1"  
export TCL_LIBRARY TK_LIBRARY TKPATH
  1. Désactivez (s'il était activé) et source à nouveau votre veng:
deactivate  
source bin/activate

L'erreur "Tcl missing" devrait disparaître.

1
MF.OX

IDLE est probablement en train de définir le chemin requis pour TCL. Pour savoir quel chemin est utilisé par IDLE, comparez la sortie de sys.path à partir de IDLE et sans IDLE. Vous pouvez ensuite ajouter l'emplacement de init.tcl à l'aide d'une variable d'environnement ou par programme. Voir la suggestion de Xenomorph.

0
Josep Valls