web-dev-qa-db-ja.com

Python TkinterがTclエラーをスロー

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

私がここで見逃しているものへのポインタは、非常に役立ちます。

10
charan

WindowsでVirtualenvを使用している場合、ここで解決策を見つけました: https://github.com/pypa/virtualenv/issues/9

「tcl」フォルダーをC:\ Python27 \から新しいVirtualenvのルートにコピーしました。Tkinter.Tk()は、例外をスローせずに新しいウィンドウを表示します。

私はWindows7でPython 2.7を実行しています。

10
B-Axe

Activestate PythonとTCLをインストールした後、同様の問題が発生しました。次のページで問題が解決したことがわかりました: ActiveState Python =インストールの問題 。修正は、C:\Python27\tclの内容をC:\Python27\Libにコピーすることでした。

別の潜在的な解決策(同じ問題で別の ActiveStateスレッド のユーザーi-shenlによって与えられる)は、 環境変数$TCL_LIBRARY tclライブラリフォルダー( "C:/ Python27/tcl "、質問で)。これをシステム全体またはアカウント全体に( システムプロパティ を介して)設定すると、TCLライブラリを使用する他のプログラムに影響します(インストールされている場合) )。 Powershellを使用している場合は、この変数を profile に設定して、シェルから実行されるプログラムへの影響を制限できます。

7
pav

TclフォルダーからLibフォルダーに2つのフォルダーをコピーする必要があります

tcl8.5およびtk8.5

Ubuntu17.04で64ビットのvirtualenvwrapperを使用して同じ問題が発生しましたPython 2.7

ローカルにtkおよびtclライブラリパスを追加します postactivate script

  1. Virtualenvに移動します:workon your-env-name
  2. 例:gedit $VIRTUAL_ENV/bin/postactivateのように、お気に入りのエディターでローカルのpostactiaveスクリプトを編集します。
  3. 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

  4. Virtualenvを再起動します:deactivateおよびworkon your-env-name
3
Kamil Czerski

python -m venv NAME種類の仮想環境でこの種のエラーが発生した場合(実際にシステムにtclがインストールされている場合)、 Suggested と同様にパスをエクスポートする必要があります。 virtualenvの以前の投稿でKamilCzerskiによって。

  1. TKパスとTCLパスを確認するには、venv( source )のpythonスクリプトoutsideを実行します。
import tkinter
root = tkinter.Tk()   
print(root.tk.exprstring('$tcl_library'))   
print(root.tk.exprstring('$tk_library'))
  1. Venv構成ファイル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
  1. 非アクティブ化して(アクティブ化されている場合)、venvを再度ソースします。
deactivate  
source bin/activate

「Tclがありません」-エラーはなくなるはずです。

1
MF.OX

IDLEはおそらくTCLに必要なパスを設定しています。 IDLEで使用されているパスを確認するには、IDLEからのsys.pathの出力とIDLEを使用しない場合の出力を比較します。次に、環境変数を使用するか、プログラムでinit.tclの場所を追加できます。 Xenomorphの提案を参照してください。

0
Josep Valls