在本博客中,我们将介绍如何使用 wxPython 和 sqlite3 模块构建一个 GUI 应用程序,该程序可以遍历指定文件夹中的所有图片,并将其信息存储到 SQLite 数据库中。
C:\pythoncode\new\InputImageOFFolderTOSqlite.py
项目简介
我们的目标是创建一个程序,该程序能够从用户指定的文件夹中读取图片文件,并将图片的以下信息存储到 SQLite 数据库的 pics
表中:
- 图片数据(BLOB)
- 图片文件名
- 图片完整路径
- 图片的最后修改日期
- 图片的 MD5 码
环境设置
在开始编写代码之前,确保你已安装 wxPython 和 SQLite3 模块。可以使用以下命令安装 wxPython:
pip install wxPython
代码实现
以下是实现上述功能的完整 Python 程序:
import wx
import os
import sqlite3
import hashlib
from datetime import datetime
class SQLiteImageImporter(wx.Frame):
def __init__(self, parent, title):
super(SQLiteImageImporter, self).__init__(parent, title=title, size=(500, 300))
self.panel = wx.Panel(self)
vbox = wx.BoxSizer(wx.VERTICAL)
# Directory Selection
hbox1 = wx.BoxSizer(wx.HORIZONTAL)
self.dir_path_text = wx.TextCtrl(self.panel)
dir_path_btn = wx.Button(self.panel, label='Select Directory')
dir_path_btn.Bind(wx.EVT_BUTTON, self.on_select_directory)
hbox1.Add(self.dir_path_text, proportion=1, flag=wx.EXPAND|wx.ALL, border=5)
hbox1.Add(dir_path_btn, flag=wx.ALL, border=5)
# Import Button
import_btn = wx.Button(self.panel, label='Import Images')
import_btn.Bind(wx.EVT_BUTTON, self.on_import_images)
vbox.Add(hbox1, flag=wx.EXPAND)
vbox.Add(import_btn, flag=wx.ALL|wx.CENTER, border=10)
self.panel.SetSizer(vbox)
self.Centre()
self.Show()
def on_select_directory(self, event):
with wx.DirDialog(self, "Choose directory with images", "", wx.DD_DEFAULT_STYLE) as dirDialog:
if dirDialog.ShowModal() == wx.ID_OK:
self.dir_path_text.SetValue(dirDialog.GetPath())
def on_import_images(self, event):
dir_path = self.dir_path_text.GetValue()
if not dir_path:
wx.MessageBox('Directory path is required', 'Error', wx.OK | wx.ICON_ERROR)
return
db_path = "C:\\pythoncode\\new\\data\\picbase.db"
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
cursor.execute('''
CREATE TABLE IF NOT EXISTS pics (
id INTEGER PRIMARY KEY AUTOINCREMENT,
pic BLOB,
picname TEXT,
picpath TEXT,
picdate TEXT,
picmd5 TEXT
)
''')
for root, _, files in os.walk(dir_path):
for filename in files:
file_path = os.path.join(root, filename)
if os.path.isfile(file_path) and file_path.lower().endswith(('.png', '.jpg', '.jpeg', '.bmp', '.gif')):
with open(file_path, 'rb') as f:
pic_data = f.read()
picname = filename
picpath = file_path
picdate = datetime.fromtimestamp(os.path.getmtime(file_path)).strftime('%Y-%m-%d %H:%M:%S')
picmd5 = hashlib.md5(pic_data).hexdigest()
cursor.execute('''
INSERT INTO pics (pic, picname, picpath, picdate, picmd5)
VALUES (?, ?, ?, ?, ?)
''', (pic_data, picname, picpath, picdate, picmd5))
conn.commit()
conn.close()
wx.MessageBox('Images imported successfully', 'Success', wx.OK | wx.ICON_INFORMATION)
if __name__ == '__main__':
app = wx.App(False)
frame = SQLiteImageImporter(None, "SQLite Image Importer")
app.MainLoop()
代码解释
- 选择目录:用户可以通过点击“Select Directory”按钮选择包含图片的文件夹。
- 导入图片:点击“Import Images”按钮将所选文件夹及其子文件夹中的所有图片文件导入到数据库中。
- 数据库结构:数据库表
pics
包含以下字段:pic
: 图片数据(BLOB)picname
: 图片文件名picpath
: 图片完整路径picdate
: 图片文件的最后修改日期picmd5
: 图片文件的 MD5 码
使用步骤
- 运行程序后,首先选择包含图片的文件夹。
- 点击“Import Images”按钮,将图片文件导入到数据库中。
- 程序会在指定路径
C:\pythoncode\new\data\picbase.db
创建或更新数据库并插入图片信息。
结果如下:
结语
通过这个简单的 GUI 应用程序,用户可以方便地将指定文件夹及其子文件夹中的所有图片信息批量导入到 SQLite 数据库中。该程序实现了基本的数据库操作和文件处理功能,是一个不错的学习和实践例子。希望本文能对你有所帮助!如果有任何问题或建议,欢迎留言讨论。