Python tkinter exe, созданный с помощью cx_freeze для windows, не отображает графический интерфейс

ЗАДАЧА РЕШЕНА. проблема была в модуле jaraco, который я использовал для работы с буфером обмена, вместо этого я использовал pyperclip.

Я сделал приложение python с tkinter, которое отлично работает, но я хотел сделать из него exe, чтобы он был удобен для пользователя в Windows. Для этого я использовал библиотеку cx_Freeze, она тоже работает нормально, но не всегда.

При создании exe с помощью cx_Freeze вы можете указать базовый параметр, если вы не укажете ни один, который откроет 2 окна, окно cmd и окно графического интерфейса для вашего приложения. Чтобы избавиться от окна cmd, вы можете указать «Win32GUI» в качестве базового параметра для cx_Freeze.

Это игнорирует окно cmd и просто открывает графический интерфейс, похоже, он работает, но не всегда. Иногда открытие exe-файла запускает процесс, но графический интерфейс не отображается. Открытие cmd и переход в каталог вашего exe и запуск его оттуда фактически покажет графический интерфейс и устранит проблему, пока вы не перезагрузите компьютер (вы можете открыть приложение без cmd, все работает до перезапуска)

Кажется, что пока окно cmd находится в вашей оперативной памяти, графический интерфейс будет отображаться, в противном случае он «не знает» и не может отображать графический интерфейс.

Код можно найти здесь:https://github.com/GrishaDev/ClipMagic

clip.py это все приложение

setup.py - это файл, используемый cx_Freeze для получения exe приложения, где вы указываете базовый параметр и т. д.

фрагмент кода, в котором, скорее всего, возникла проблема (setup.py):

import sys
from cx_Freeze import setup, Executable
# import os
# os.environ['TCL_LIBRARY'] = "C:\\Users\\Grisha\\AppData\\Local\\Programs\\Python\\Python35\\tcl\\tcl8.6"
# os.environ['TK_LIBRARY'] = "C:\\Users\\Grisha\\AppData\\Local\\Programs\\Python\\Python35\\tcl\\tk8.6"
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')

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

setup(name="clipmagic",
      version="1",
      description="Extended clipboard",
      options={'build_exe': {'includes': ["jaraco", "tkinter"], 'include_files':[
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'),
            os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'),
            'icon.ico',
         ]}},
      executables=[Executable("clip.py", base=base, icon='icon.ico')])

#"Win32GUI"

Спасибо!

Пожалуйста, не ссылайтесь на код на другом сайте. Вместо этого создайте минимальный воспроизводимый пример и включите его прямо в свой вопрос.

Bryan Oakley 13.09.2018 20:26

@BryanOakley Я сделал это, чтобы вопрос не выглядел гигантским со всем кодом, а github - отличный источник для просмотра кода, я включу сюда свой setup.py, поскольку он меньше.

hey 13.09.2018 20:39

Нам не нужен «весь код». Мы хотим создать небольшой минимальный воспроизводимый пример только для этого вопроса. И github - это нет, отличный источник кода для вопросов, поскольку ветка, на которую вы ссылаетесь, может со временем обновляться или удаляться, что делает вопрос бесполезным.

Bryan Oakley 13.09.2018 20:40
1
3
1 006
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Глядя на README.md в вашем репозитории кода, вы используете текущую версию cx_Freeze, то есть 5.1.1. В этой версии включенные модули находятся в подкаталоге lib каталога сборки. Добавленные вручную библиотеки DLL, по-видимому, тоже нужно переместить туда. См. этот ответ.

Попробуйте внести следующие изменения в ваш сценарий setup.py:

options={'build_exe': {'includes': ["jaraco", "tkinter"], 'include_files':[
    (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll'), os.path.join('lib', 'tk86t.dll')),
    (os.path.join(PYTHON_INSTALL_DIR, 'DLLs', 'tcl86t.dll'), os.path.join('lib', 'tcl86t.dll')),
    'icon.ico',
    ]}},

Да, но в build, где build - это каталог сборки. На мой взгляд, их надо ставить в build/lib.

jpeg 13.09.2018 20:39

Я не совсем понимаю, как включить его в место сборки / lib, я попробовал следующее: (os.path.join ('lib', os.path.join (PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll') )) вместо предыдущего, но он все равно помещает dll просто для сборки /

hey 13.09.2018 21:04

@hey Я отредактировал свой ответ, чтобы объяснить, как я это сделаю.

jpeg 13.09.2018 21:12

спасибо, мне просто понравился ваш пример, перезапустил мой компьютер, и он не работает, я буквально вижу, как графический интерфейс появляется на полсекунды, и он исчез, но работает в процессах

hey 13.09.2018 21:17

Тогда я не понимаю, как я мог бы вам помочь, пока вы не предоставили Минимальный, полный и проверяемый пример, как рекомендовано @BryanOakley, извините.

jpeg 13.09.2018 21:21

это просто setup.py, вы его видели. Я все равно включаю это как снимок экрана в свой вопрос .. Спасибо за помощь, надеюсь, скоро найду решение

hey 13.09.2018 21:28

Вам также необходимо создать минимальное приложение с tkinter, показывающее поведение, о котором вы сообщили, и опубликовать код в своем вопросе. И, пожалуйста, скопируйте и вставьте код в виде текста вместо использования снимка экрана, я не понимаю, почему это не должно работать в SO, это желаемое поведение.

jpeg 13.09.2018 21:40

эй, я снова смотрю на это, и, похоже, это проблема с кодом самого приложения, я скомпилировал другие приложения tkinter, и они работают нормально. Я использую многопоточность в своем приложении для обработки графического интерфейса пользователя и использования прослушивателей горячих клавиш в моем приложении. Может ли это вызвать проблемы? Не могли бы вы еще раз взглянуть на мой код здесь: github.com/GrishaDev/ClipMagic/blob/master/clip.py Также я использую python 3.5. Это действительно поможет, спасибо.

hey 18.09.2018 16:41

Думаю, я исправил это! По крайней мере, на данный момент он работает. ПРОБЛЕМА: это была проблема с модулем jaraco, я использовал pyperclip вместо этого для использования буфера обмена, и теперь он, похоже, работает все время, сделал 2 перезапуска, и он работает, как предполагалось.

hey 18.09.2018 17:26

Звучит здорово! Таким образом, похоже, что последовательное добавление компонентов, начиная с минимального примера, действительно было ключевым моментом.

jpeg 18.09.2018 20:31

Другие вопросы по теме