py2exe ImportError: Нет модуля с именем 'tkinter._fix' - PullRequest
0 голосов
/ 21 сентября 2018

Я использую py2exe для создания моего отдельного исполняемого файла, уже пробовал pyinstaller, cx_freeze и даже nuitka, и ничего из этого не работает.Проблема заключается в том, что py2exe вызывает следующую ошибку: ImportError: Нет модуля с именем 'tkinter._fix'

Я использовал tkinter для сборки своего приложения.

Мой установочный файл выглядит следующим образом:

from distutils.core import setup
import py2exe

setup(console=['BioRank.py'], options =  {'py2exe':{'packages':['numpy','tkinter','pandas','xlwt']}})

Я использую windows10, python 3.4 и py2exe 0.9.2.2

Кто-нибудь может мне помочь, пожалуйста?

1 Ответ

0 голосов
/ 26 октября 2018

У меня недавно была такая же проблема при использовании nuitka.Я решил эту проблему, добавив свою собственную логику, копируя отсутствующие части TK / TCL:

import sys, os, subprocess, shutil
pscript = sys.argv[1]
pscript_n = pscript[:-3]
EXE = pscript_n + ".exe"

if not os.path.exists(pscript):
    raise SystemExit("Python source '%s' does not exist!" % pscript)

tk  = os.path.join(sys.exec_prefix,"tcl", "tk8.6")
tcl = os.path.join(sys.exec_prefix,"tcl", "tcl8.6")
if not os.path.exists(tk):
    raise SystemExit("unexpected: '%s' does not exist!" % tk)
if not os.path.exists(tcl):
    raise SystemExit("unexpected: '%s' does not exist!" % tcl)

dist_path = os.path.join("compiled", pscript_n + ".dist")
if os.path.exists(dist_path):
    print("removing old binaries ...")
    shutil.rmtree(dist_path, ignore_errors=True)

if not os.path.exists("compiled"):
    print("creating 'compiled' sub dir ...")
    os.mkdir("compiled")
    os.mkdir(os.path.join("compiled", "lib"))
    os.mkdir(os.path.join("compiled", "bin"))
    tar_tk  = os.path.join("compiled", "lib", "tk8.6")
    tar_tcl = os.path.join("compiled", "lib", "tcl8.6")
    shutil.copytree(tk, tar_tk)
    shutil.copytree(tcl, tar_tcl)
    print("'compiled' sub dir created")

print("Next messages are from Nuitka compilation.\n")

cmd = "python -m nuitka --portable --remove-output --output-dir=compiled " + pscript

subprocess.call(cmd)

copy_cmd = "xcopy /E/S/Y %s compiled\\bin" % dist_path
if os.path.exists(dist_path):
    print("".ljust(100, "-"))
    print("nuitka successful, now xcopying to compiled\\bin directory")
    print("".ljust(100, "-"))
    subprocess.call(copy_cmd)
    print("".ljust(100, "-"))
    print("'%s' should now be in '%s' and in 'compiled\\bin'\n" % (EXE, dist_path))

Что он делает: Он ищет и копирует соответствующие библиотеки TK и TCL и помещает их вместе в каталог с именем "lib" рядом содин создан самой нуиткой (которая называется scriptname.dist).Затем я копирую материал .dist в каталог «run».Вы можете повторить этот скрипт для каждого скрипта, для которого вы хотите .exe.Они попадут в каталог «run», чтобы со временем сформировать библиотеку ваших собственных EXE-файлов.

...