2015-03-28 3 views
9

Я изучаю базовый графический интерфейс в Python, и я наткнулся на пример, чтобы прочитать имя файла из файла explorer на Stack Overflow.Python Tkinter throwing Tcl error

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) 

Данный скрипт работает нормально, когда я пытаюсь запустить его в режиме ожидания, но то же не работает, если я пытаюсь из командной строки в ОС Windows 7.

Python Версия: 2,7. Вот выходная ошибка, которую я получаю.

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

Любой указатель на то, что мне не хватает здесь, может оказать большую помощь.

+0

Вы уверены, что версия python, которую вы используете в режиме ожидания, является той же версией, которая используется в командной строке? –

+0

@BryanOakley да, я использую ту же версию. Вот фрагмент того же IDLE: Python 2.7 (r27: 82525, 4 июля 2010, 07:43:08) [MSC v.1500 64 бит (AMD64)] на win32 Python CmdLine: Python 2.7 (r27 : 82525, 4 июля 2010, 07:43:08) [MSC v.1500 64 бит (AMD64)] на win32 – charan

+0

Если вы выполните быстрый поиск по сети, набрав: 'Невозможно найти полезный init.tcl в следующие каталоги', вы найдете что-то;) – nbro

ответ

10

В случае, если вы используете Virtualenv на Windows, я нашел решение здесь: https://github.com/pypa/virtualenv/issues/93

Я скопировал папку «TCL» из C: \ python27 \ к корню новой Virtualenv, Tkinter.Tk() показывает новое окно без исключения исключения.

Я бегу на Python 2.7 на Windows 7.

0

IDLE, вероятно, указав путь, необходимый для TCL. Чтобы узнать, какой путь используется IDLE, сравните вывод sys.path с IDLE и без IDLE. Затем вы можете добавить местоположение init.tcl либо с помощью переменной окружения, либо программно. См. Предложение Xenomorph.

5

Удалите аналогичную проблему после установки Activestate Python и TCL. Я нашел следующую страницу решить проблему для меня: ActiveState Python install problem. Исправление должно было скопировать содержимое C:\Python27\tcl в C:\Python27\Lib.

Другим потенциальным решением (задается пользователем и-shenl в другом ActiveState thread по тому же вопросу) будет установить environment variable$TCL_LIBRARY, чтобы указать на папку библиотеки TCL («C:/python27/TCL», в вопросе) , Если вы установите эту общесистемную или общую учетную запись (через System Properties), это повлияет на другие программы, в которых используется библиотека TCL (если они установлены). Если вы используете Powershell, вы можете установить эту переменную в своем profile, чтобы ограничить ее влияние на программы, запускаемые из оболочки.

+0

Копирование содержимого этой папки работало для меня. Все файлы/папки в подпапке tcl начинались с tk или tcl, а ни одна из вложенных папок назначения не выполнялась - я проверил это, прежде чем сделать копию, если захочу снова ее вернуть! – Rich

5

Вам просто нужно скопировать две папки из папки TCL в папку Lib

tcl8.5 и tk8.5

1

Я ударил с такой же проблемой на Ubuntu 17.04 с virtualenvwrapper 64 бит Python 2.7

добавить Tk и библиотеки TCL пути в местной postactivate script

  1. Перейти к вашему virtualenv: workon your-env-name
  2. Редактировать местный сценарий postactiave с вашим любимым редактором, например: gedit $VIRTUAL_ENV/bin/postactivate
  3. Найдите пути библиотеки tk и tcl. В сценарии postactivate экспортируйте TK_LIBRARY и TCL_LIBRARY с соответствующими путями.Добавьте эти строки в сценарий с модифицированными путями:

    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. Перезапустите virtualenv: deactivate и workon your-env-name снова.