KeyError: 'TCL Library' quand j'utilise CX Freeze

quand j'utilise cx_Freeze - je obtenir un keyerror KeyError: 'TCL_Library' en construisant mon programme pygame. Pourquoi j'obtiens ça et comment je le Répare?

Mon setup.py est ci-dessous:

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")],
    )
31
demandé sur Vadim Kotov 2016-02-21 11:12:12

5 réponses

Vous pouvez contourner cette erreur en définissant les variables d'environnement manuellement:

set TCL_LIBRARY=C:\Program Files\Python35-32\tcl\tcl8.6
set TK_LIBRARY=C:\Program Files\Python35-32\tcl\tk8.6

Vous pouvez aussi le faire dans le setup.py script:

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([..])

Mais j'ai trouvé que le fait d'exécuter le programme ne fonctionne pas. Sur le cx_freeze liste de diffusion, il a été mentionné:

j'ai regardé dans déjà et non, il n'est pas juste une simple recompilation -- ou il aurait déjà été fait! : -)

Il est en cours et il semble que cela va prendre un peu d'effort. Certains de le code en place pour gérer des choses comme les modules d'extension à l'intérieur des paquets est en train de tomber -- et cela pourrait être mieux résolu en laissant tomber ce code et forcer l'emballage extérieur le fichier zip (un tiroir demande pour être absorbé). Je devrais l'avoir la semaine prochaine et la semaine suivante pour examiner cette question plus loin. Ainsi toutes les choses bien je devrait mettre une nouvelle version de cx_Freeze avant la fin de l'année.

mais peut-être avez-vous plus de chance ... voici le rapport de bogue.

44
répondu Martin Tournoij 2018-02-16 17:58:08

au lieu de définir les variables d'environnement en utilisant des chemins absolus spécifiques à l'installation comme C:\LOCAL_TO_PYTHON\... vous pouvez aussi dériver les chemins nécessaires dynamiquement en utilisant le __file__ attribut du paquet standard de Python comme os:

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

après cette correction, le fichier exécutable sera créé, mais vous obtiendrez probablement une erreur "DLL non trouvé" lorsque vous essayez de l'exécuter - au moins avec Python 3.5.3 et cx_Freeze 5.0.1 sur Windows 10.

Lorsque vous ajoutez ce qui suit options, les fichiers DLL nécessaires seront copiés automatiquement à partir du répertoire D'Installation de Python vers le build-output De cx-Freeze et vous devriez pouvoir exécuter votre application 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,
      # ...
)
27
répondu D. L. Müller 2017-03-26 20:58:32

il suffit de mettre cela avant la configuration à 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"

Et l'exécuter:

python setup.py bdist_msi

cela a bien fonctionné pour moi.

13
répondu Guilherme 2017-01-13 18:09:38

Si vous obtenez l'erreur suivante avec 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'

il suffit de créer LOCAL_TO_PYTHON dir C:\ ensuite créer Python35-32 dir à l'intérieur. Maintenant, copiez tcl dir existant Python36 dir (C:\) en Python35-32.

alors ça marche très bien.

4
répondu Ben Wills 2017-02-22 17:26:47

Si vous obtenez l'erreur suivante avec python 3.6:

copie C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6 ->build\exe.win-amd64-3.6\tcl erreur: [Errno 2] No such file or directory: 'C:\LOCAL_TO_PYTHON\Python35-32\tcl\tcl8.6'

il suffit de créer LOCAL_TO_PYTHON dir en C:\ puis de créer Python35-32 dir à l'intérieur. Maintenant, copiez tcl dir à partir de python36 dir existant (en C:) dans Python35-32.

alors ça marche très bien.

**j'ai fait ces étapes et j'ai créé un .exe fichier dans la construction dir mais si ı essayez de cliquer sur l'app ne pas attendre sur l'écran instantanément rapide, mes codes ici **

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()
0
répondu Onur Çakır 2018-06-06 15:02:56