为了账号安全,请及时绑定邮箱和手机立即绑定

是否可以将 python 代码与 tkinter 和 sqlite3 数据库包捆绑到一个 exe

是否可以将 python 代码与 tkinter 和 sqlite3 数据库包捆绑到一个 exe

catspeake 2023-05-23 14:35:38
所以,我在使用 Tkinter 和 Python 时遇到的另一个问题是,我发现不可能将整套代码与 tkinter 和 sqlite 3 数据库捆绑到一个 exe 文件中,以便共享。每次,我这样做 exe 文件将无法正常运行。甚至可以这样做,还是我必须完全从 SQLite3 中移出。 # Core Packagesimport tkinter as tkfrom tkinter import *from tkinter import ttkfrom tkinter.scrolledtext import *import tkinter.filedialogfrom tkcalendar import Calendar, DateEntryfrom tkinter import messageboxfrom tkintertable import TableCanvas, TableModelfrom tkinter import ttk# Databaseimport sqlite3import csvconn = sqlite3.connect('data.db')c = conn.cursor()def create_table():    c.execute('CREATE TABLE IF NOT EXISTS usersdata(firstname TEXT,lastname TEXT,email TEXT,age TEXT,date_of_birth TEXT,address TEXT,phonenumber REAL)')def add_data(firstname,lastname,email,age,date_of_birth,address,phonenumber):    c.execute('INSERT INTO usersdata(firstname ,lastname ,email ,age,date_of_birth,address,phonenumber ) VALUES (?,?,?,?,?,?,?)',(firstname,lastname,email,age,date_of_birth,address,phonenumber))    conn.commit()def view_all_users():    c.execute('SELECT * FROM usersdata')    data = c.fetchall()    # for row in data:    #   print(row)    # return data    for row in data:        print(row)        tree.insert("", tk.END, values=row)    # tab2_display.insert(tk.END,data)def view_all_details():    c.execute('SELECT * FROM usersdata')    data = c.fetchall()    # for row in data:    #   print(row)    # return data    for row in data:        # print(row)        # tree.insert("", tk.END, values=row)        tab2_display.insert("",tk.END,row)  def get_single_user(firstname):    c.execute('SELECT * FROM usersdata WHERE firstname="{}"'.format(firstname))    data = c.fetchall()    # tab2_display.insert(tk.END,data)    return datadef edit_single_user(firstname,new_name):    c.execute('UPDATE usersdata SET firstname ="{}" WHERE firstname="{}"'.format(new_name,firstname        ))    conn.commit()    data = c.fetchall()    return data
查看完整描述

1 回答

?
慕容3067478

TA贡献1773条经验 获得超3个赞

是的,使用 Tkinter 和 SQLite 制作可执行文件是完全可能的。

Pyinstaller在虚拟环境中安装后,您应该创建一个main.spec具有以下格式的文件,以便您有足够的自由来完全自定义您的 exe 文件。根据您的代码,您可能需要更少或更多的功能:

# -*- mode: python -*-

import os


block_cipher = None


current_dir = os.path.dirname(os.path.curdir)


a = Analysis(['main.py'],

             # pathex=['output_path'],

             pathex=[current_dir],

             binaries=[],

             datas=[

                 ('img/*.png', 'img'),

                 ('inputs/*.csv', 'inputs'),

                 ('databases/*.db', 'databases'),

                 ('settings.ini', '.'),

             ],

             hiddenimports=[],

             hookspath=[],

             runtime_hooks=[],

             excludes=[],

             win_no_prefer_redirects=False,

             win_private_assemblies=False,

             cipher=block_cipher)


pyz = PYZ(a.pure, a.zipped_data,

          cipher=block_cipher)


exe = EXE(pyz,

          a.scripts,

          a.binaries,

          a.zipfiles,

          a.datas,

          Tree('documentation/_build/html', prefix='documentation/_build/html/'),

          name='Project Name',

          debug=False,

          strip=False,

          upx=True,

          console=False)

您应该正确设置output_path和Project Name。此外,此脚本假定您的主文件名为main.py,但您也可以更改它。如您所见,在这种情况下,我捆绑了所有图像、csv 文件、数据库 (SQLite) 甚至从 Sphinx 创建的文档。


然后,您必须调用以下命令:


path_to_pyinstaller/pyinstaller --onefile main.spec --key your_key

path_to_pyinstaller你的virtualenv下安装Pyinstaller的路径在哪里。您还必须设置your_key.


还有其他库也可以使用,例如cx_Freeze,但同样,我通常使用Pyinstaller.


重要的是要记住,在捆绑时,可能会出现一些与相对路径相关的错误。我的解决方案是定义一个resource_path这样的函数:


import sys


# Get the absolute path

def resource_path(relative_path):

    """ Get absolute path to resource, works for dev and for PyInstaller """

    try:

        # PyInstaller creates a temp folder and stores path in _MEIPASS

        base_path = sys._MEIPASS

    except Exception as e:

        # print(e)

        base_path = os.path.abspath(".")


    return os.path.join(base_path, relative_path)

然后,在调用任何图像、文件或数据库时都应该使用此函数。例如,当连接到 SQLite 时,您应该执行以下操作:


import sqlite3


self.conn = sqlite3.connect(resource_path(database_path))

database_path数据库的相对路径在哪里。


查看完整回答
反对 回复 2023-05-23
  • 1 回答
  • 0 关注
  • 127 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信