Search code examples
pythonpython-3.xtkintercx-freeze

When using cx_Freeze and tkinter I get: "DLL load failed: The specified module could not be found." (Python 3.5.3)


When using cx_Freeze and Tkinter, I am given the message:

File "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\lib\tkinter\__init__.py", line 35, in <module>
import _tkinter # If this fails your Python may not be configured for Tk
ImportError: DLL load failed: The specified module could not be found.

Some things to note:

  • I want to use Python 3+ (Currently using 3.5.3, 32-bit). Don't really care about a specific version, whatever works.
  • My project has multiple files I need to compile. As far as I can tell, that leaves me with cx_Freeze or Nuitka. Nuitka had problems of its own.
  • I am using Windows 10 Home Edition, 64-bit

Here is my current setup.py:

from cx_Freeze import setup, Executable    
import sys  

build_exe_options = {"packages": ["files", "tools"]}  

base = None    
if sys.platform == "win32":    
    base = "Win32GUI"    

setup(name="Name",  
      version="1.0",  
      description="Description",  
      options={"build_exe": build_exe_options},  
      executables=[Executable("main.py", base=base)],  
      package_dir={'': ''},  
      )

I have tried many solutions from all corners of the internet. Including but not limited to:

  • Multiple versions of python (and the corresponding cx_Freeze/Tkinter versions)
  • Both 32-bit and 64-bit versions
  • Replacing Tkinter with easygui (apparently easygui needs Tkinter to work)
  • Checking the PATH variables
  • Restarting my computer (Don't know what I expected)
  • Uninstalling other versions of python and repairing the correct version
  • Placing the following in my compile bat file (Definetly the correct paths):

    set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tcl8.6
    set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\tcl\tk8.6
    
  • Placing the following in my setup.py:

    options={"build_exe": {"includes": ["tkinter"]}}
  • Along with:
    include_files = [r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tcl86t.dll",\
                     r"C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35-32\DLLs\tk86t.dll"]

(And yes, those were included in setup() in one way or another)


Thanks for any help, it's greatly appreciated. And yes, I have looked at just about every solution to this problem on this site. Hoping someone could help me find yet another solution since my problem seems to be persistent.


Solution

  • Found a solution!

    I had to copy the tk86t.dll and tcl86t.dll files from my python directory's DLLs folder into the build folder with the main.py I was trying to compile.

    This, in conjunction with having

    set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tcl8.6  
    set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python35\tcl\tk8.6
    

    at the top of my compile.bat, and including
    "include_files": ["tcl86t.dll", "tk86t.dll"]
    in my build_exe_options in setup.py, seems to have done the trick.

    Here is my current setup.py:

    from cx_Freeze import setup, Executable  
    import sys  
    
    build_exe_options = {"packages": ["files", "tools"], "include_files": ["tcl86t.dll", "tk86t.dll"]}  
    
    base = None  
    if sys.platform == "win32":  
        base = "Win32GUI"  
    
    setup(name="Name",  
        version="1.0",  
        description="Description",  
        options={"build_exe": build_exe_options},  
        executables=[Executable("main.py", base=base)],  
        package_dir={'': ''},  
        )  
    

    And here is my compile.bat (updated to show all steps):

    @echo off
    set TCL_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tcl8.6
    set TK_LIBRARY=C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\tcl\tk8.6
    RD /S /Q "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
    mkdir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin"
    xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tcl86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tcl86t.dll"
    xcopy /s "C:\Users\VergilTheHuragok\AppData\Local\Programs\Python\Python36-32\DLLs\tk86t.dll" "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin\tk86t.dll"
    cd "C:\Users\VergilTheHuragok\Desktop\PythonProject\"
    cxfreeze main.py --target-dir "C:\Users\VergilTheHuragok\Desktop\PythonProjectCompiled\bin" --target-name "launch.exe"
    pause  
    

    I found this solution here.