Программа Tkinter, скомпилированная с помощью pyinstaller cra sh при запуске - PullRequest
0 голосов
/ 30 марта 2020

Я прошу помощи сегодня, потому что я новичок в Tkinter и Pyinstaller (и python в целом), и у меня возникают проблемы с этим.

У меня есть простое приложение, работающее с sqlite, tkinter и pyinstaller, чтобы скомпилировать все это в исполняемой программе, точкой входа моей программы является файл с именем main.py

. Этот файл вызывает все зависимости (например, модуль sqlite для python, tkinter и другие мои файлы, такие как classes et c ...)

Я сделал очень простой интерфейс с Hello World в ярлыке tkinter и кнопкой для go на странице 2 который отображает page2 (также в метке), просто чтобы посмотреть, смогу ли я заставить все это работать и скомпилировать все эти части вместе.

Я могу запустить его через свою оболочку выполнить его так: python main.py и все работает нормально.

Но когда я запускаю pyinstaller на своем компьютере linux и начинаю выполнять программу, ничего не появляется, мой database.db (файл базы данных sqlite) создан но у меня нет интерфейс, как когда я запускаю его с моей оболочкой. Ситуация становится еще хуже в windows, где, когда у меня есть .exe, через несколько секунд он просто открывает оболочку и создает sh, даже не создавая базу данных.

То, что я сделал, это Я создал «файл журнала», в котором я записал шаги программы.

Как вы можете видеть на следующем рисунке, 2 первых отпечатка записаны в моем файле журнала (на linux), поэтому я думаю, что он вылетает, когда я пытаюсь создать окно.

enter image description here

Если у кого-то из вас есть представление о том, что я делаю неправильно, я бы действительно признателен за помощь:)

1 Ответ

0 голосов
/ 31 марта 2020

Общее

Из руководства по PyInstaller:

Прежде чем пытаться объединить в один файл, убедитесь, что ваше приложение работает правильно, когда оно объединено в одну папку. Диагностировать проблемы в режиме одной папки намного проще.

Как и предлагалось в комментариях, используйте универсальный блок try / except для регистрации всех исключений в файле. Это, наверное, лучший способ увидеть, что на самом деле происходит. Убедитесь, что файл журнала создан в существующем месте, где у вас есть необходимые разрешения.

Я бы предложил использовать встроенный модуль logging вместо создания собственного. Например, он может автоматически добавлять, из какого файла была создана строка журнала.

ИМХО, вполне вероятно, что сбои на Linux и ms- windows имеют совершенно разные причины. Вероятно, вам следует рассматривать их как различные проблемы.

Linux

Когда вы используете режим одного файла, этот файл распаковывается во временную папку, вероятно, где-то в /tmp. Некоторые дистрибутивы Linux монтируют файловую систему /tmp с флагом noexec. Это несовместимо с PyInstaller.

ms- windows

На windows в основном есть два разных питона; python.exe и pythonw.exe. В основном это одна из причуд windows, что это необходимо. Последний предназначен для GUI программ, таких как tkinter программ. Скрипт tkinter не должен показывать окно cmd. Поэтому я предполагаю, что PyInstaller вызывает вашу команду с python.exe вместо pythonw.exe. Из руководства:

По умолчанию загрузчик создает консоль командной строки (окно терминала в ОС GNU / Linux и Ma c, окно команд в Windows). Он предоставляет это окно интерпретатору Python для стандартного ввода и вывода. Использование сценариев print и input () направлено сюда. Сообщения об ошибках от Python и вывод журнала по умолчанию также отображаются в окне консоли.

Опция для Windows и Ma c OS - указать PyInstaller не предоставлять окно консоли. Загрузчик запускается Python без цели для стандартного вывода или ввода. Делайте это, когда ваш скрипт имеет графический интерфейс для ввода данных пользователем и может правильно сообщать о своей собственной диагностике.

Как отмечено в учебном приложении CPython, для Windows расширение файла .pyw подавляет окно консоли, которое обычно появляется. Аналогично, консольное окно не будет предоставляться при использовании сценария myscript.pyw с PyInstaller.

Кроме того, на windows может иметь значение, какой дистрибутив Python вы используете. Раньше я был фанатом Anaconda, но в последнее время я предпочел версию python.org, потому что она дает мне меньше головной боли. На anaconda Python у меня была проблема, что программы tkinter не запускались без отображения окна cmd, что бы я ни пытался. Только переключение на python.org Python решило эту проблему.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...