cx_Freeze
を使用すると、pygameプログラムのビルド中にkeyerror KeyError: 'TCL_Library'
が発生します。なぜこれを入手し、どうすれば修正できますか?
私のsetup.pyは以下です:
from cx_Freeze import setup, Executable
setup(
name = "Snakes and Ladders",
version = "0.9",
author = "Adam",
author_email = "Omitted",
options = {"build_exe": {"packages":["pygame"],
"include_files": ["main.py", "squares.py",
"pictures/Base Dice.png", "pictures/Dice 1.png",
"pictures/Dice 2.png", "pictures/Dice 3.png",
"pictures/Dice 4.png", "pictures/Dice 5.png",
"pictures/Dice 6.png"]}},
executables = [Executable("run.py")],
)
環境変数を手動で設定することにより、このエラーを回避できます。
set TCL_LIBRARY=C:\Program Files\Python35-32\tcl\tcl8.6
set TK_LIBRARY=C:\Program Files\Python35-32\tcl\tk8.6
setup.py
スクリプトでそれを行うこともできます。
os.environ['TCL_LIBRARY'] = r'C:\Program Files\Python35-32\tcl\tcl8.6'
os.environ['TK_LIBRARY'] = r'C:\Program Files\Python35-32\tcl\tk8.6'
setup([..])
しかし、実際にプログラムを実行しても機能しないことがわかりました。 cx_freezeメーリングリストで言及されました :
私はすでにそれを調べましたが、いや、単純な再コンパイルではありません-または、すでに行われているでしょう! :-)
進行中であり、少し手間がかかるようです。パッケージ内の拡張モジュールのようなものを処理するために配置されているコードの一部は転倒しています-そして、それはそのコードをドロップし、Zipファイル(吸収される必要がある別のプル要求)の外にパッケージを強制することによってよりよく解決されるかもしれません。これをさらに調査するために、来週と次の週に時間が必要です。すべてがうまく機能しているので、年末までにcx_Freezeの新しいバージョンをリリースする必要があります。
しかし、おそらくあなたはもっと幸運を持っています... バグレポートはこちら 。
C:\\LOCAL_TO_PYTHON\\...
などのインストール固有の絶対パスを使用して環境変数を設定する代わりに、os
などのPython標準パッケージの__file__
属性を使用して必要なパスを動的に導出することもできます。
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
この修正後、実行可能ファイルは作成されますが、実行しようとすると「DLL not foundエラー」が表示される可能性があります-少なくともWindows 10上のPython 3.5.3およびcx_Freeze 5.0.1で。
次のオプションを追加すると、必要なDLLファイルがPython-Installationディレクトリからcx-Freezeのビルド出力に自動的にコピーされ、Tcl/Tkアプリケーションを実行できるようになります。
options = {
'build_exe': {
'include_files':[
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
],
},
}
# ...
setup(options = options,
# ...
)
Setup.pyでセットアップする前にこれを置くだけです
import os
os.environ['TCL_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6"
os.environ['TK_LIBRARY'] = "C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tk8.6"
そしてそれを実行します:
python setup.py bdist_msi
これは私にとってはうまくいきました。
python 3.6で次のエラーが発生する場合:
copying C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6 -> build\exe.win-AMD64-3.6\tcl
error: [Errno 2] No such file or directory: 'C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6'
LOCAL_TO_PYTHON
にC:\
dirを作成し、その中にPython35-32
dirを作成するだけです。 tcl
dirを既存のPython36
dir(C:\
内)からPython35-32
にコピーします。
その後、正常に動作します。
D。L.Müllerの回答 cx_Freezeバージョン5.1.1または5.1.0に変更する必要があります。これらのバージョンのcx_Freezeでは、パッケージはビルドディレクトリのサブディレクトリlib
に凍結されます。 TCLおよびTK DLLもそこに移動する必要があります。これは、タプル(source, destination)
をinclude_files
リストオプションの対応するエントリに渡すことで実現できます( cx_Freeze documentation を参照)。
setup.py
スクリプト全体を次のように変更する必要があります。
import os.path
PYTHON_INSTALL_DIR = os.path.dirname(os.path.dirname(os.__file__))
os.environ['TCL_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tcl8.6')
os.environ['TK_LIBRARY'] = os.path.join(PYTHON_INSTALL_DIR, 'tcl', 'tk8.6')
# ...
options = {
'build_exe': {
'include_files':[
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll'))
(os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll'))
],
},
}
# ...
setup(options = options,
# ...
)
python 3.6で次のエラーが発生する場合:
C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6
-> build\exe.win-AMD64-3.6\tcl
エラーのコピー:[Errno 2] No such file or directory: 'C:\\LOCAL_TO_PYTHON\\Python35-32\\tcl\\tcl8.6'
C:\にLOCAL_TO_PYTHON dirを作成し、その中にPython35-32 dirを作成します。次に、tcl dirを既存のPython36 dir(C :)からPython35-32にコピーします。
その後、正常に動作します。
**この手順を実行し、ビルドディレクトリに.exeファイルを作成しましたが、アプリをクリックしようとすると、画面上ですぐに待機しないでください、ここに私のコード**
from tkinter import *
import socket
window=Tk()
window.geometry("400x150")
window.title("IpConfiger")
window.config(background="black")
def goster():
x=socket.gethostbyname(socket.gethostname())
label=Label(window,text=x,fg="green",font=("Helvetica",16))
label.pack()
def information():
info=Label(window,text="Bu program anlık ip değerini
bastırır.",fg="green",font=("Helvetica",16),bg="black")
info.pack()
information()
tikla=Button(window,text="ip göster",command=goster)
tikla.pack()