ЗАДАЧА РЕШЕНА. проблема была в модуле 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"
Спасибо!
@BryanOakley Я сделал это, чтобы вопрос не выглядел гигантским со всем кодом, а github - отличный источник для просмотра кода, я включу сюда свой setup.py, поскольку он меньше.
Нам не нужен «весь код». Мы хотим создать небольшой минимальный воспроизводимый пример только для этого вопроса. И github - это нет, отличный источник кода для вопросов, поскольку ветка, на которую вы ссылаетесь, может со временем обновляться или удаляться, что делает вопрос бесполезным.
Глядя на 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
.
Я не совсем понимаю, как включить его в место сборки / lib, я попробовал следующее: (os.path.join ('lib', os.path.join (PYTHON_INSTALL_DIR, 'DLLs', 'tk86t.dll') )) вместо предыдущего, но он все равно помещает dll просто для сборки /
@hey Я отредактировал свой ответ, чтобы объяснить, как я это сделаю.
спасибо, мне просто понравился ваш пример, перезапустил мой компьютер, и он не работает, я буквально вижу, как графический интерфейс появляется на полсекунды, и он исчез, но работает в процессах
Тогда я не понимаю, как я мог бы вам помочь, пока вы не предоставили Минимальный, полный и проверяемый пример, как рекомендовано @BryanOakley, извините.
это просто setup.py, вы его видели. Я все равно включаю это как снимок экрана в свой вопрос .. Спасибо за помощь, надеюсь, скоро найду решение
Вам также необходимо создать минимальное приложение с tkinter, показывающее поведение, о котором вы сообщили, и опубликовать код в своем вопросе. И, пожалуйста, скопируйте и вставьте код в виде текста вместо использования снимка экрана, я не понимаю, почему это не должно работать в SO, это желаемое поведение.
эй, я снова смотрю на это, и, похоже, это проблема с кодом самого приложения, я скомпилировал другие приложения tkinter, и они работают нормально. Я использую многопоточность в своем приложении для обработки графического интерфейса пользователя и использования прослушивателей горячих клавиш в моем приложении. Может ли это вызвать проблемы? Не могли бы вы еще раз взглянуть на мой код здесь: github.com/GrishaDev/ClipMagic/blob/master/clip.py Также я использую python 3.5. Это действительно поможет, спасибо.
Думаю, я исправил это! По крайней мере, на данный момент он работает. ПРОБЛЕМА: это была проблема с модулем jaraco, я использовал pyperclip вместо этого для использования буфера обмена, и теперь он, похоже, работает все время, сделал 2 перезапуска, и он работает, как предполагалось.
Звучит здорово! Таким образом, похоже, что последовательное добавление компонентов, начиная с минимального примера, действительно было ключевым моментом.
Пожалуйста, не ссылайтесь на код на другом сайте. Вместо этого создайте минимальный воспроизводимый пример и включите его прямо в свой вопрос.