Я пытаюсь заморозить приложение python 3.7 с помощью cx_Freeze и заставить его работать на Windows (10).
Приложение довольно маленькое и простое, оно читает с COM-порта и имеет Tk окно, отображающее материал, поступающий через последовательную ссылку.
У меня были проблемы, но в конце концов удалось все заморозить без ошибок, exe работает без сбоев, но почему-то последовательное открытие / чтение не будет работать, когда терминал скрыт. Я обнаружил, что некоторые ошибки появляются, когда я включаю терминал, удаляя base='Win32GUI'
, но он не показывает никаких ошибок (только мои журналы) и фактически заставляет его работать.
Вот мой setup.py
файл, который я затем использую с python setup.py build
:
from cx_Freeze import setup, Executable
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')
include_files = [os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
'icon/']
packages = ["serial"]
setup(
name='App',
description='App',
version='0.1.0',
options={'build_exe': {'include_files': include_files, 'packages': packages}},
executables=[Executable('win_app_main.py',
targetName='app.exe',
icon='icon/icon.ico',
copyright='Copyright (C) <name> 2018',
# base='Win32GUI'
)]
)
Обратите внимание на base='Win32GUI'
, exe работает, когда он комментируется, но не когда я его включаю.
Что я могу сделать, чтобы приложение действительно работало, без отображения терминала сзади.
Код приложения довольно длинный, но его можно суммировать как:
# Have all tk components created and place on the grid...
queue_serial_recv = queue.Queue()
uart_th = UartRecv(queue_out=queue_serial_recv)
uart_th.start()
def update_current_win(event=None):
# Do some stuff with the window components
receive_serial(queue_serial_recv)
# Update according to received data
root.after(500, update_current_win)
root.after(200, update_current_win)
root.mainloop()
uart_th.running = False
uart_th.join()
Должен быть небольшой твик, который я не понял. Спасибо за вашу помощь