wxpython 在 运行 sqlite3 命令时关闭应用程序

wxpython close app when run sqlite3 commands

我正在尝试在 python 3.7 中使用 SQLite3 编写程序。界面是WxPython 4.0.3,然后我用Nuitka 0.6.0编译它。在其他项目中,使用 Nuitka 编译的 WxPython 运行良好。但是此刻我尝试用 SQLite 启动一个数据库程序自动关闭。

看到会发生什么后,我通过右键单击并在程序的根文件中 "open with python" 启动了代码。它也会自动关闭。但是,如果在文件夹中我打开 CMD 并 运行 带有 "python app.py" 的文件,程序运行良好。

这里我保留简化脚本。如果您只是删除带有 self.db = sqlite3.connect("database.db") 的行,然后右键单击打开代码并使用 python 打开,程序将打开并且运行良好。但是当你离开线路与 SQLite 建立连接时,它就会停止工作。我不知道从哪里得到它,当我在 google 中搜索时,我得到的结果与此无关。

代码:

import wx
import sqlite3

class MyFrame(wx.Frame):
    def __init__(self):
        super(MyFrame, self).__init__(None, id=wx.ID_ANY, title="PDF database",
                                      pos=wx.DefaultPosition, size=wx.Size(500, 300),
                                      style=wx.DEFAULT_FRAME_STYLE | wx.TAB_TRAVERSAL)

        self.db = sqlite3.connect("database.db")

if __name__ == "__main__":
    app = wx.App()
    main_window = MyFrame()
    main_window.Show()
    app.MainLoop()

`

我可能在这里遗漏了一些东西,但看起来如果您使用 Nuitka 进行独立安装,它排除了可能导致问题的 sqlite。在此处的优化标题下查看 Nuitka 的变更日志:

我知道在使用 py2exe 和 PyInstaller 时我已经能够使用 sqlite 和 wxPython。

经过一段时间的研究,我找到了解决办法。

此问题是 python 在右键单击和 "open with python" 时开始的地方。如果您的脚本很简单:

import os
print(os.getcwd())
input("whatever")

如果您通过打开 cmd 并使用 cd 移动到带有 "this_code.py" 的文件夹来打开该脚本。您会看到终端打印出您所在文件夹的目录。但是如果您右键单击并在终端中 "open with python" 打印到 System32 的路径。此外,您还需要输入来冻结等待用户按回车键的终端,因为如果您不包含 "input",终端将在您看到目录之前关闭(或通过 try-except 打印的错误) .

所以当我有 SQLite 的时候。右键打开文件时用python打开。 SQLite 尝试在 System32 文件夹中查找或创建 "database.db"。并且存在权限问题。要解决此问题,无论以何种方式或在何处都可以打开文件。只需添加:

import os
script_dir = os.path.dirname(os.path.abspath(__file__))

script_dir 将是文件的位置,而不是调用文件的位置 Python。因此,当您打开与 SQLite 的连接时。使用 sqlite3.connect(f'file:{script_dir}/database.db', uri=True)

无论您如何打开它或从何处调用它,它都将始终具有相同的正确行为。