cx_freeze и pyserial проблема (работа с терминалом, без работы без) - PullRequest
0 голосов
/ 24 января 2020

Я пытаюсь заморозить приложение 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()

Должен быть небольшой твик, который я не понял. Спасибо за вашу помощь

...