私はPythonで基本的なGUIを学んでおり、 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)
この特定のスクリプトは、IDLEで実行しようとすると正常に機能しますが、Windows7でコマンドプロンプトから実行しようとすると同じことが実行されません。
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
私がここで見逃しているものへのポインタは、非常に役立ちます。
WindowsでVirtualenvを使用している場合、ここで解決策を見つけました: https://github.com/pypa/virtualenv/issues/9
「tcl」フォルダーをC:\ Python27 \から新しいVirtualenvのルートにコピーしました。Tkinter.Tk()は、例外をスローせずに新しいウィンドウを表示します。
私はWindows7でPython 2.7を実行しています。
Activestate PythonとTCLをインストールした後、同様の問題が発生しました。次のページで問題が解決したことがわかりました: ActiveState Python =インストールの問題 。修正は、C:\Python27\tcl
の内容をC:\Python27\Lib
にコピーすることでした。
別の潜在的な解決策(同じ問題で別の ActiveStateスレッド のユーザーi-shenlによって与えられる)は、 環境変数$TCL_LIBRARY
tclライブラリフォルダー( "C:/ Python27/tcl "、質問で)。これをシステム全体またはアカウント全体に( システムプロパティ を介して)設定すると、TCLライブラリを使用する他のプログラムに影響します(インストールされている場合) )。 Powershellを使用している場合は、この変数を profile に設定して、シェルから実行されるプログラムへの影響を制限できます。
TclフォルダーからLibフォルダーに2つのフォルダーをコピーする必要があります
tcl8.5およびtk8.5
Ubuntu17.04で64ビットのvirtualenvwrapperを使用して同じ問題が発生しましたPython 2.7
ローカルにtkおよびtclライブラリパスを追加します postactivate script
workon your-env-name
gedit $VIRTUAL_ENV/bin/postactivate
のように、お気に入りのエディターでローカルのpostactiaveスクリプトを編集します。Tkおよびtclライブラリパスを見つけます。アクティベート後のスクリプトで、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
deactivate
およびworkon your-env-name
。python -m venv NAME
種類の仮想環境でこの種のエラーが発生した場合(実際にシステムにtclがインストールされている場合)、 Suggested と同様にパスをエクスポートする必要があります。 virtualenvの以前の投稿でKamilCzerskiによって。
import tkinter root = tkinter.Tk() print(root.tk.exprstring('$tcl_library')) print(root.tk.exprstring('$tk_library'))
bin/activate
を開き、それらがexport PATH
する場所を見つけて、この後に挿入します(手順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
deactivate source bin/activate
「Tclがありません」-エラーはなくなるはずです。
IDLEはおそらくTCLに必要なパスを設定しています。 IDLEで使用されているパスを確認するには、IDLEからのsys.pathの出力とIDLEを使用しない場合の出力を比較します。次に、環境変数を使用するか、プログラムでinit.tclの場所を追加できます。 Xenomorphの提案を参照してください。