2015-03-28 21 views
9

Sto imparando la GUI di base in Python e mi sono imbattuto in un esempio di esempio per leggere il nome del file da Esplora file su Stack Overflow.Python Tkinter che lancia errore Tcl

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) 

Questo script particolare sta funzionando bene quando sto cercando di eseguirlo in IDLE, ma lo stesso non è in esecuzione, se sto cercando dal prompt dei comandi in Windows 7.

Python Versione: 2.7. Ecco l'errore di output che ottengo.

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

Qualsiasi puntatore a ciò che mi manca qui può essere di grande aiuto.

+0

Sei sicuro che la versione di Python che usi in idle sia la stessa versione utilizzata sulla riga di comando? –

+0

@BryanOakley sì Sto usando la stessa versione. Ecco uno snippet dello stesso IDLE: Python 2.7 (r27: 82525, 4 luglio 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] su win32 Python CmdLine: Python 2.7 (r27 : 82525, 4 luglio 2010, 07:43:08) [MSC v.1500 64 bit (AMD64)] su win32 – charan

+0

Se si esegue una ricerca rapida sul Web digitando: 'Impossibile trovare un init.tcl utilizzabile in le seguenti directory », troverai qualcosa;) – nbro

risposta

10

Nel caso in cui si utilizza virtualenv su Windows ho trovato una soluzione qui: https://github.com/pypa/virtualenv/issues/93

ho copiato la cartella "TCL" da C: \ Python27 \ verso la radice della nuova VIRTUALENV, Tkinter.Tk() mostra una nuova finestra senza generare un'eccezione.

Sono in esecuzione Python 2.7 su Windows 7.

0

IDLE è probabilmente l'impostazione del percorso necessario per TCL. Per scoprire quale percorso viene utilizzato da IDLE, confrontare l'output di sys.path da IDLE e senza IDLE. Quindi è possibile aggiungere il percorso di init.tcl usando una variabile d'ambiente o programmaticamente. Vedi suggerimento Xenomorph.

5

Colpire un problema simile dopo aver installato Activestate Python e TCL. Ho trovato la seguente pagina risolto il problema per me: ActiveState Python install problem. La correzione era di copiare il contenuto di C:\Python27\tcl in C:\Python27\Lib.

Un'altra soluzione potenziale (dato dall'utente I-SHENL in una diversa ActiveState thread sullo stesso argomento) è impostare la environment variable$TCL_LIBRARY per puntare alla cartella della libreria tcl ("C:/Python27/TCL", nella questione) . Se si imposta questo sistema o l'intero account (tramite System Properties), questo avrà effetto su altri programmi che utilizzano una libreria TCL (se ne sono installati). Se utilizzi Powershell, puoi impostare questa variabile nel tuo profile per limitare i suoi effetti sui programmi eseguiti dalla shell.

+0

La copia dei contenuti di quella cartella ha funzionato per me. Tutti i file/cartelle nella sottocartella tcl iniziarono con tk o tcl e nessuno nella sottocartella di lib di destinazione lo fece - L'ho verificato prima che facessi la copia nel caso volessi farlo di nuovo indietro! – Rich

5

Hai solo bisogno di copiare due cartelle dalla cartella tcl nella cartella Lib

tcl8.5 e tk8.5

1

mi ha colpito lo stesso problema su Ubuntu 17.04 con virtualenvwrapper per 64 bit Python 2.7

aggiungo percorsi TK e biblioteca TCL in locale postactivate script

  1. Vai al tuo virtualenv: workon your-env-name
  2. Modificare lo script postactiave locale con il tuo editor preferito, ad esempio: gedit $VIRTUAL_ENV/bin/postactivate
  3. Individuare percorsi libreria tk e tcl. Nello script postactivate, esportare TK_LIBRARY e TCL_LIBRARY con percorsi appropriati.Aggiungere queste righe allo script con percorsi modificati:

    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. Riavviare il virtualenv: deactivate e workon your-env-name di nuovo.