diff --git a/launch.py b/launch.py index eae5b19e..34dd5072 100644 --- a/launch.py +++ b/launch.py @@ -21,6 +21,7 @@ import fooocus_version from build_launcher import build_launcher from modules.launch_util import is_installed, run, python, run_pip, requirements_met, delete_folder_content from modules.model_loader import load_file_from_url +from tkinter_installer import install_tkinter, check_tkinter_installed REINSTALL_ALL = False TRY_INSTALL_XFORMERS = False @@ -72,6 +73,9 @@ def ini_args(): return args +if not check_tkinter_installed(): + install_tkinter() + prepare_environment() build_launcher() args = ini_args() diff --git a/tkinter_installer.py b/tkinter_installer.py new file mode 100644 index 00000000..90db3b19 --- /dev/null +++ b/tkinter_installer.py @@ -0,0 +1,84 @@ +import sys +import os +import shutil +import zipfile +import importlib +import urllib.request + + +def detect_python_version(): + version = sys.version_info + version_str = f"{version.major}.{version.minor}" + is_embedded = hasattr(sys, '_base_executable') or (sys.base_prefix != sys.prefix and not hasattr(sys, 'real_prefix')) + return version_str, is_embedded + + +def check_tkinter_installed(): + try: + import tkinter + print("Success - Tkinter is installed.") + return True + except ImportError: + print("Tkinter is not installed.") + return False + + +def download_and_unzip_tkinter(): + url = "https://github.com/ChrisColeTech/tkinter-standalone/releases/download/1.0.0/tkinter-standalone.zip" + zip_path = "tkinter-standalone.zip" + print(f"Downloading {url}...") + urllib.request.urlretrieve(url, zip_path) + + print("Unzipping tkinter-standalone.zip...") + with zipfile.ZipFile(zip_path, 'r') as zip_ref: + zip_ref.extractall("tkinter-standalone") + + os.remove(zip_path) + print("Download and extraction complete.") + + +def copy_tkinter_files(version_str): + src_folder = os.path.join("tkinter-standalone", version_str, "python_embedded") + number_only = version_str.replace(".","") + python_zip = f"python{number_only}" + python_zip_path = os.path.join(src_folder, f"{python_zip}.zip") + with zipfile.ZipFile(python_zip_path, 'r') as zip_ref: + zip_ref.extractall(os.path.join(src_folder, python_zip)) + + + if not os.path.exists(src_folder): + print(f"Error: No tkinter files for Python {version_str}") + return + + python_dir = os.path.dirname(sys.executable) + print(f"Copying tkinter files from {src_folder} to {python_dir}...") + shutil.copytree(src_folder, python_dir, dirs_exist_ok=True) + + print("Tkinter files copied successfully.") + shutil.rmtree(src_folder, ignore_errors=True) + + +def install_tkinter(): + version_str, is_embedded = detect_python_version() + print(f"Detected Python version: {version_str}") + print(f"Is Embedded Python: {is_embedded}") + + tkinter_installed = check_tkinter_installed() + + if tkinter_installed: + return + + if not tkinter_installed or is_embedded: + download_and_unzip_tkinter() + copy_tkinter_files(version_str) + import_tkinter() + + +def import_tkinter(): + try: + tkinter = importlib.import_module("tkinter") + print("Success - Tkinter is installed.") + return tkinter + except ImportError: + print("Failed to import Tkinter after installation.") + return None \ No newline at end of file