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

Python 使用pyinstaller编译的Tkinter程序在启动时崩溃,python,tkinter,pyinstaller,Python,Tkinter,Pyinstaller,我今天请求帮助是因为我对Tkinter和Pyinstaller(以及一般的python)还不熟悉,所以遇到了一些问题 我有一个简单的应用程序与sqlite、tkinter和pyinstaller一起工作,在一个可执行程序中编译所有这些,我的程序的入口点是一个名为main.py的文件 该文件调用所有依赖项(如python的sqlite模块、tkinter和我的其他文件,如类等) 我制作了一个非常简单的界面,在tkinter标签中有一个Hello World,还有一个按钮可以转到第2页,第2页显示第

我今天请求帮助是因为我对Tkinter和Pyinstaller(以及一般的python)还不熟悉,所以遇到了一些问题

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

该文件调用所有依赖项(如python的sqlite模块、tkinter和我的其他文件,如类等)

我制作了一个非常简单的界面,在tkinter标签中有一个Hello World,还有一个按钮可以转到第2页,第2页显示第2页(也在标签中),只是想看看我是否能够让它全部运行,并将所有这些部分一起编译

我可以在shell中运行它,就像:
python main.py
那样执行它,一切都很好

但是,当我在linux机器上运行pyinstaller并开始执行该程序时,什么也没有出现,我的database.db(sqlite数据库文件)被创建了,但我没有任何像在shell中运行它那样的接口。在windows上,情况变得更糟,一旦我有了
.exe
,它就会打开一个shell,几秒钟后崩溃,甚至不创建数据库

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

正如您在下图中所看到的,第一次打印的两个文件都写在我的日志文件中(在linux上),因此我认为当我尝试创建窗口时,它会崩溃

如果你们中有人知道我做错了什么,我将非常感谢你们的帮助:)

General 从PyInstaller手册:

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

如注释所示,使用catch all
try
/
except
块将所有异常记录到文件中。这可能是了解真实情况的最佳方式。确保在您拥有必要权限的现有位置创建日志文件

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

恕我直言,Linux和ms windows上的故障可能有完全不同的原因。你可能应该把它们当作不同的问题来对待

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

微软视窗 在windows上,基本上有两种不同的蟒蛇
python.exe
pythonw.exe
。基本上这是窗户的一个怪癖,这是必要的。后者用于GUI程序,如
tkinter
程序。tkinter脚本不应显示
cmd
窗口。所以我猜PyInstaller使用
python.exe
而不是
pythonw.exe
调用您的命令。从手册中:

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

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

如CPython教程附录中所述,对于Windows,文件扩展名为.pyw会抑制通常显示的控制台窗口。同样,在PyInstaller中使用myscript.pyw脚本时,也不会提供控制台窗口


此外,在windows上,使用哪个Python发行版也很重要。我曾经是Anaconda的粉丝,但最近我更喜欢
python.org
版本,因为它让我不那么头疼。在anaconda Python上,我遇到了一个问题,tkinter程序在没有显示
cmd
窗口的情况下无法启动,无论我做了什么尝试。只有切换到
python.org
python才解决了这个问题。

您必须在
窗口中查看它不喜欢什么。出于简单的调试目的(一般不推荐),您可以将整个内容放在
try
中。一旦出现错误,您可以将回溯(
traceback.format_exc()
)保存到一个文件中,从而找到您的问题。