pyinstaller编译的Tkinter程序在启动时崩溃

时间:2020-03-30 18:38:13

标签: python tkinter pyinstaller

我今天要寻求帮助,因为我是Tkinter和Pyinstaller(以及python的新手)的新手,并且遇到了麻烦。

我有一个使用sqlite,tkinter和pyinstaller的简单应用程序,可以在可执行程序中编译所有这些程序,我程序的入口是一个名为main.py的文件

此文件调用所有依赖项(例如python的sqlite模块,tkinter以及我的其他文件(例如类等)

我做了一个非常简单的界面,在tkinter标签中带有一个 Hello World ,并有一个按钮转到第2页,该页面显示 page2 (也在标签中),只是看看我是否有能力使其全部运行并将所有这些部分一起编译。

我可以像执行python main.py一样在我的shell中运行它,一切正常。

但是,当我在linux机器上运行pyinstaller并开始执行程序时,什么都没有出现,我的database.db(sqlite数据库文件)被创建了,但是没有像使用shell运行它那样的界面。在Windows上,情况变得更加糟糕,在Windows中,.exe刚打开一个外壳并在几秒钟后崩溃,甚至没有创建数据库。

我要做的是创建一个“日志文件”,在其中编写程序步骤。

如下面的图片所示,前两张照片已写在我的日志文件中(在Linux上),所以我认为在尝试创建窗口时它会崩溃。

enter image description here

如果您对我做错了什么有想法,我将非常感谢您的帮助:)

1 个答案:

答案 0 :(得分:0)

常规

从PyInstaller手册中:

在尝试将文件捆绑到一个文件之前,请确保将您的应用程序捆绑到一个文件夹时可以正常工作。在单文件夹模式下诊断问题要容易得多。

根据注释的建议,使用全包try / except块将所有异常记录到文件中。这可能是了解实际情况的最佳方法。确保在具有必要权限的现有位置中创建日志文件。

我建议利用内置的logging模块,而不要创建自己的模块。它可以例如自动添加从哪个文件创建日志行。

恕我直言,Linux和ms-windows上的故障很可能具有完全不同的原因。您可能应该将它们视为不同的问题。

Linux

使用单文件模式时,该文件将被解压缩到一个临时文件夹中,该文件夹可能位于/tmp中。某些Linux发行版使用/tmp标志挂载noexec文件系统。这与PyInstaller不兼容。

ms-windows

在Windows上,基本上有两种不同的Python; python.exepythonw.exe。基本上,这是Windows的怪癖之一。后者用于tkinter程序之类的GUI程序。 tkinter脚本不应显示cmd窗口。因此,我猜测PyInstaller使用python.exe而不是pythonw.exe来调用您的命令。从手册中:

默认情况下,引导程序会创建一个命令行控制台(在GNU / Linux和Mac OS中为终端窗口,在Windows中为命令窗口)。它将此窗口提供给Python解释器以用于其标准输入和输出。您的脚本对print和input()的使用直接在这里。来自Python的错误消息和默认的日志记录输出也会显示在控制台窗口中。

Windows和Mac OS的一个选项是告诉PyInstaller不提供控制台窗口。引导加载程序以没有标准输出或输入目标的Python启动。当脚本具有用于用户输入的图形界面并且可以正确报告其自身的诊断时,请执行此操作。

如CPython教程附录中所述,对于Windows,文件扩展名.pyw抑制了通常出现的控制台窗口。同样,将myscript.pyw脚本与PyInstaller一起使用时,将不会提供控制台窗口。

此外,在Windows上使用的是哪个Python发行版也很重要。我曾经是Anaconda的粉丝,但是最近我开始偏爱python.org版本,因为它减轻了我的麻烦。在anaconda Python上,我遇到的问题是,无论尝试什么,如果不显示cmd窗口,tkinter程序将无法启动。仅切换到python.org Python即可解决该问题。