【问题标题】:Tkinter program compiled with pyinstaller crash on launch使用 pyinstaller 编译的 Tkinter 程序在启动时崩溃
【发布时间】:2020-03-30 18:38:13
【问题描述】:

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

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

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

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

我可以通过我的 shell 来运行它,例如:python main.py 并且一切正常。

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

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

正如您在下图中看到的,前 2 次打印已写入我的日志文件(在 linux 上),所以我认为当我尝试创建窗口时它会崩溃。

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

【问题讨论】:

  • 你必须看看它在Window中不喜欢什么。
  • 为了简单的调试目的(一般不推荐)你能把整个东西放在try中吗?一旦出现错误,您可以将回溯 (traceback.format_exc()) 保存到文件中,从而找到您的问题。

标签: python tkinter pyinstaller


【解决方案1】:

一般

来自 PyInstaller 手册:

在您尝试捆绑到一个文件之前,请确保您的应用在捆绑到一个文件夹时能够正常运行。在一个文件夹模式下诊断问题要容易得多。

按照 cmets 的建议,使用包罗万象的 try/except 块将所有异常记录到文件中。这可能是了解实际情况的最佳方式。确保在您拥有必要权限的现有位置创建日志文件。

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

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

Linux

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

ms-windows

在 Windows 上,基本上有两种不同的 Python; python.exepythonw.exe。基本上这是必要的窗口的怪癖之一。后者适用于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 上,我遇到的问题是 tkinter 程序不会在不显示 cmd 窗口的情况下启动,无论我尝试了什么。只有切换到python.org Python 才能解决这个问题。

【讨论】:

    猜你喜欢
    • 2020-01-16
    • 1970-01-01
    • 1970-01-01
    • 2016-03-25
    • 2022-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多