第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機(jī)立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

是否可以將 python 代碼與 tkinter 和 sqlite3 數(shù)據(jù)庫包捆綁到一個 exe

是否可以將 python 代碼與 tkinter 和 sqlite3 數(shù)據(jù)庫包捆綁到一個 exe

catspeake 2023-05-23 14:35:38
所以,我在使用 Tkinter 和 Python 時遇到的另一個問題是,我發(fā)現(xiàn)不可能將整套代碼與 tkinter 和 sqlite 3 數(shù)據(jù)庫捆綁到一個 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貢獻(xiàn)1773條經(jīng)驗 獲得超3個贊

是的,使用 Tkinter 和 SQLite 制作可執(zhí)行文件是完全可能的。

Pyinstaller在虛擬環(huán)境中安裝后,您應(yīng)該創(chuàng)建一個main.spec具有以下格式的文件,以便您有足夠的自由來完全自定義您的 exe 文件。根據(jù)您的代碼,您可能需要更少或更多的功能:

# -*- 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)

您應(yīng)該正確設(shè)置output_path和Project Name。此外,此腳本假定您的主文件名為main.py,但您也可以更改它。如您所見,在這種情況下,我捆綁了所有圖像、csv 文件、數(shù)據(jù)庫 (SQLite) 甚至從 Sphinx 創(chuàng)建的文檔。


然后,您必須調(diào)用以下命令:


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

path_to_pyinstaller你的virtualenv下安裝Pyinstaller的路徑在哪里。您還必須設(shè)置your_key.


還有其他庫也可以使用,例如cx_Freeze,但同樣,我通常使用Pyinstaller.


重要的是要記住,在捆綁時,可能會出現(xiàn)一些與相對路徑相關(guān)的錯誤。我的解決方案是定義一個resource_path這樣的函數(shù):


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)

然后,在調(diào)用任何圖像、文件或數(shù)據(jù)庫時都應(yīng)該使用此函數(shù)。例如,當(dāng)連接到 SQLite 時,您應(yīng)該執(zhí)行以下操作:


import sqlite3


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

database_path數(shù)據(jù)庫的相對路徑在哪里。


查看完整回答
反對 回復(fù) 2023-05-23
  • 1 回答
  • 0 關(guān)注
  • 199 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號