【问题标题】:wxpython close app when run sqlite3 commands运行 sqlite3 命令时 wxpython 关闭应用程序
【发布时间】:2018-09-26 10:28:03
【问题描述】:

我正在尝试在 python 3.7 中使用 SQLite3 制作程序。该接口使用 WxPython 4.0.3,然后我使用 Nuitka 0.6.0 编译它。在其他项目中,用 Nuitka 编译的 WxPython 运行良好。但目前我尝试使用 SQLite 启动数据库,程序会自动关闭。

在看到可能发生的情况后,我通过右键单击并在程序的根文件中“使用 python 打开”来启动代码。它也会自动关闭。但是,如果在文件夹中我打开 CMD 并使用“python app.py”运行该文件,则该程序运行良好。

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

代码:

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()

`

【问题讨论】:

    标签: python sqlite wxpython


    【解决方案1】:

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

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

    【讨论】:

    • 这与 Niutka 无关。 Niutka 是错误的“展示者”。但是后来,我尝试了不同的方式来启动 python 代码,即预编译的方式。如果我右键单击“app.py”和“用 Python 打开”(用 CPython 解释),错误是一样的。我去一些地方询问并找到了解决方案。我会将其放在正确的答案中以将其标记为已接受。 (无论如何,感谢 pdf,它在其他问题上帮助了我)。
    【解决方案2】:

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

    这个问题是当右键单击并“用 python 打开”时 python 开始的地方。如果你有一个简单的脚本:

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

    如果您通过打开 cmd 并使用 cd 移动到包含“this_code.py”的文件夹来打开该脚本。您会看到终端打印了您所在文件夹的目录。但是如果您右键单击并在终端中“使用 python 打开”,则会打印 System32 的路径。此外,您还需要输入来冻结终端等待用户按 Enter,因为如果您不包含“输入”,则终端会在您看到目录之前关闭(或通过 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)

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

    【讨论】:

      猜你喜欢
      • 2013-09-05
      • 1970-01-01
      • 2011-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多