本文记录了尝试使用deepseek创建应用程序的过程,实现记录事件&时间的PC应用程序,包括创建代码、测试及调整。
目的:创建一个应用,用户输入文本提交,应用记录下时间和文本,数据留存在excel和应用程序中。
1. 使用deepseek生成代码
命令如下:
帮我写一个应用程序,实现的功能是,用户输入一段文字,然后应用程序会记录下输入的文字和时间,记录的数据会留在桌面的excel表格中。用户输入的文字和时间也会显示在应用程序的页面。使用python代码写,在win10的系统下可以运行。
2. 测试代码是否可运行
import tkinter as tk
from tkinter import messagebox, ttk
from datetime import datetime
import os
import openpyxl
def save_to_excel(text, timestamp):
# 获取桌面路径
desktop = os.path.join(os.path.expanduser('~'), 'Desktop')
file_path = os.path.join(desktop, 'user_input_records.xlsx')
# 检查文件是否存在
if not os.path.exists(file_path):
# 创建新工作簿并添加标题
wb = openpyxl.Workbook()
ws = wb.active
ws.append(['时间', '用户输入'])
else:
wb = openpyxl.load_workbook(file_path)
ws = wb.active
# 添加新记录
ws.append([timestamp, text])
try:
wb.save(file_path)
except PermissionError:
messagebox.showerror("错误", "请先关闭Excel文件再操作!")
return False
return True
def submit_text():
input_text = entry.get().strip()
if not input_text:
messagebox.showwarning("警告", "请输入内容!")
return
timestamp = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
if save_to_excel(input_text, timestamp):
# 在列表框最前面插入新记录
history_listbox.insert(0, f"{timestamp} - {input_text}")
entry.delete(0, tk.END)
def create_gui():
window = tk.Tk()
window.title("用户输入记录器")
window.geometry("600x400")
# 使用ttk样式
style = ttk.Style()
style.theme_use('clam')
# 输入区域
input_frame = ttk.Frame(window)
input_frame.pack(pady=10, padx=10, fill=tk.X)
ttk.Label(input_frame, text="输入内容:").pack(side=tk.LEFT)
global entry
entry = ttk.Entry(input_frame, width=40)
entry.pack(side=tk.LEFT, padx=5)
entry.bind('<Return>', lambda event: submit_text()) # 绑定回车键
submit_btn = ttk.Button(input_frame, text="提交", command=submit_text)
submit_btn.pack(side=tk.LEFT, padx=5)
# 历史记录区域
history_frame = ttk.Frame(window)
history_frame.pack(pady=10, padx=10, fill=tk.BOTH, expand=True)
ttk.Label(history_frame, text="历史记录:").pack(anchor=tk.W)
global history_listbox
history_listbox = tk.Listbox(history_frame,
height=10,
selectmode=tk.SINGLE,
font=('Microsoft YaHei', 10))
history_listbox.pack(fill=tk.BOTH, expand=True, pady=5)
# 添加滚动条
scrollbar = ttk.Scrollbar(history_listbox)
scrollbar.pack(side=tk.RIGHT, fill=tk.Y)
history_listbox.config(yscrollcommand=scrollbar.set)
scrollbar.config(command=history_listbox.yview)
# 退出按钮
exit_btn = ttk.Button(window, text="退出", command=window.destroy)
exit_btn.pack(pady=5)
# 加载已有历史记录
desktop = os.path.join(os.path.expanduser('~'), 'Desktop')
file_path = os.path.join(desktop, 'user_input_records.xlsx')
if os.path.exists(file_path):
try:
wb = openpyxl.load_workbook(file_path)
ws = wb.active
for row in ws.iter_rows(min_row=2, values_only=True):
if row[0] and row[1]:
history_listbox.insert(0, f"{row[0]} - {row[1]}")
except Exception as e:
messagebox.showerror("错误", f"读取历史记录失败: {str(e)}")
window.mainloop()
if __name__ == "__main__":
# 检查依赖库
try:
import openpyxl
except ImportError:
print("请先安装依赖库:pip install openpyxl")
exit(1)
create_gui()
3. 对代码进行打包
1)准备icon,将以上代码存为.py文件,在桌面创建一个文件夹【TextRecorder】,放入py文件和icon图标,icon图标命名为【app.ico】。
2) 环境变量检查,及必要库安装
按 Win + R 打开运行窗口,输入 cmd
打开命令行,执行以下命令确保没有问题:
# 升级pip
python -m pip install --upgrade pip
# 安装必要库
pip install pyinstaller openpyxl
# 验证安装
pyinstaller --version
如果以上的命令有无法运行的情况,可能出现的情况及解决方案如下:
情况1:xxx不是内部或外部命令,也不是可运行的程序 或批处理文件。
解决方案:环境变量配置有问题,需要到系统中重新配置环境变量的地址。容易出现的问题是找不到python的地址,通常的路径是:
C:\Users\你的用户名\AppData\Local\Programs\Python\Python310
C:\Users\你的用户名\AppData\Local\Programs\Python\Python310\Scripts
如果不是以上地址,在命令栏中输入以下命令,则显示python地址:
where python
实在找不到python就重装,重装时勾选 "Add Python to PATH"。
情况2:单条命令行运行报错
解决方案:再执行一遍
3)代码打包
在项目文件夹【TextRecorder】中打开命令行:
- 按住 Shift + 右键 → 选择 在此处打开 PowerShell 窗口
- 输入“cmd”切换为CMD
执行打包命令:
# 进阶版(带图标,需确认图标文件名正确)
pyinstaller --onefile --noconsole --name "TextRecorder" --icon=app.ico text_recorder.py
4. 检查打包文件
-
打包完成后:
- 打开项目文件夹中的
dist
子文件夹 - 找到生成的
TextRecorder.exe
文件
- 打开项目文件夹中的
-
测试运行:
- 双击运行EXE文件
- 检查桌面是否生成
user_input_records.xlsx
可能出现的问题:桌面未生成文件。
这个问题出现的原因是修改了桌面位置到非C盘,以上的python代码只会读取C盘下的桌面地址。
5. 增加历史记录删除功能
在使用应用程序时,如果输入错误想删除,则需要在应用程序中加上删除功能。而上面的代码是不支持的,调整后代码如下:
修改后问题:打开程序时,明显变慢。第一版的大小只有9M,第二版有200+M
import tkinter as tk
from tkinter import ttk, messagebox
import openpyxl
from datetime import datetime
import os
# 获取桌面路径
DESKTOP_PATH = os.path.join(os.path.expanduser("~"), "Desktop")
FILE_PATH = os.path.join(DESKTOP_PATH, "records.xlsx") # 强制保存到桌面
COLUMNS = ("timestamp", "content")
def init_excel():
if not os.path.exists(FILE_PATH):
try:
wb = openpyxl.Workbook()
ws = wb.active
ws.append(["时间戳", "记录内容"])
wb.save(FILE_PATH)
print(f"已创建新文件于桌面:{FILE_PATH}") # 调试信息
except PermissionError:
messagebox.showerror("错误", "无法在桌面创建文件,请检查写权限")
class RecordApp:
def __init__(self, root):
self.root = root
self.root.title("桌面记录管理系统")
# 显示文件路径
path_frame = ttk.Frame(self.root)
path_frame.pack(pady=5, fill=tk.X)
ttk.Label(path_frame, text=f"数据文件位置:").pack(side=tk.LEFT)
ttk.Label(path_frame, text=FILE_PATH, foreground="blue").pack(side=tk.LEFT)
self.create_widgets()
self.load_records()
def create_widgets(self):
# 输入区域
input_frame = ttk.Frame(self.root, padding=(10, 5))
input_frame.pack(fill=tk.X)
ttk.Label(input_frame, text="新记录:").pack(side=tk.LEFT)
self.entry = ttk.Entry(input_frame, width=50)
self.entry.pack(side=tk.LEFT, padx=5, fill=tk.X, expand=True)
self.entry.bind("<Return>", lambda e: self.save_record())
# 操作按钮
btn_frame = ttk.Frame(self.root, padding=(10, 5))
btn_frame.pack(fill=tk.X)
ttk.Button(btn_frame, text="提交", command=self.save_record).pack(side=tk.LEFT)
ttk.Button(btn_frame, text="删除选中", command=self.delete_selected).pack(side=tk.LEFT, padx=5)
ttk.Button(btn_frame, text="刷新", command=self.load_records).pack(side=tk.LEFT)
# 记录表格
tree_frame = ttk.Frame(self.root)
tree_frame.pack(fill=tk.BOTH, expand=True, padx=10, pady=5)
self.tree = ttk.Treeview(
tree_frame,
columns=COLUMNS,
show="headings",
selectmode="browse",
height=15
)
# 配置列
self.tree.heading("timestamp", text="时间戳", anchor=tk.W)
self.tree.heading("content", text="内容", anchor=tk.W)
self.tree.column("timestamp", width=180, stretch=False)
self.tree.column("content", width=500)
# 滚动条
vsb = ttk.Scrollbar(tree_frame, orient="vertical", command=self.tree.yview)
self.tree.configure(yscrollcommand=vsb.set)
# 布局
self.tree.grid(row=0, column=0, sticky="nsew")
vsb.grid(row=0, column=1, sticky="ns")
tree_frame.grid_columnconfigure(0, weight=1)
tree_frame.grid_rowconfigure(0, weight=1)
def save_record(self):
content = self.entry.get().strip()
if not content:
messagebox.showwarning("输入错误", "记录内容不能为空")
return
timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
try:
wb = openpyxl.load_workbook(FILE_PATH)
ws = wb.active
ws.append([timestamp, content])
wb.save(FILE_PATH)
self.entry.delete(0, tk.END)
self.load_records() # 静默刷新
except PermissionError:
messagebox.showerror("错误", "文件被占用,请关闭Excel后重试")
except Exception as e:
messagebox.showerror("错误", f"保存失败:{str(e)}")
def load_records(self):
for item in self.tree.get_children():
self.tree.delete(item)
try:
wb = openpyxl.load_workbook(FILE_PATH)
ws = wb.active
records = []
for row in ws.iter_rows(min_row=2):
if row[0].value and row[1].value:
records.append((row[0].value, row[1].value))
# 按时间倒序
records.sort(
key=lambda x: datetime.strptime(x[0], "%Y-%m-%d %H:%M:%S"),
reverse=True
)
for record in records:
self.tree.insert("", tk.END, values=record)
except FileNotFoundError:
messagebox.showwarning("错误", "桌面文件丢失,正在尝试重建...")
init_excel()
def delete_selected(self):
selected_item = self.tree.selection()
if not selected_item:
messagebox.showwarning("错误", "请先选择要删除的记录")
return
item_data = self.tree.item(selected_item, "values")
confirm = messagebox.askyesno(
"确认删除",
f"确定要永久删除这条记录吗?\n\n时间:{item_data[0]}\n内容:{item_data[1]}"
)
if not confirm:
return
try:
wb = openpyxl.load_workbook(FILE_PATH)
ws = wb.active
# 精确匹配删除
found = False
for row_idx in range(2, ws.max_row + 1):
if (ws.cell(row=row_idx, column=1).value == item_data[0]
and ws.cell(row=row_idx, column=2).value == item_data[1]):
ws.delete_rows(row_idx)
found = True
break
if found:
wb.save(FILE_PATH)
self.load_records() # 静默刷新
else:
messagebox.showwarning("错误", "未找到对应记录,可能已被删除")
except PermissionError:
messagebox.showerror("错误", "文件被占用,请关闭Excel后重试")
except Exception as e:
messagebox.showerror("错误", f"删除失败:{str(e)}")
if __name__ == "__main__":
init_excel()
root = tk.Tk()
app = RecordApp(root)
root.mainloop()