本文记录了尝试使用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 openpyxldef 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.activews.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 Falsereturn Truedef submit_text():input_text = entry.get().strip()if not input_text:messagebox.showwarning("警告", "请输入内容!")returntimestamp = 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 entryentry = 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_listboxhistory_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.activefor 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 openpyxlexcept 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.activews.append(["时间戳", "记录内容"])wb.save(FILE_PATH)print(f"已创建新文件于桌面:{FILE_PATH}") # 调试信息except PermissionError:messagebox.showerror("错误", "无法在桌面创建文件,请检查写权限")class RecordApp:def __init__(self, root):self.root = rootself.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("输入错误", "记录内容不能为空")returntimestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")try:wb = openpyxl.load_workbook(FILE_PATH)ws = wb.activews.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.activerecords = []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("错误", "请先选择要删除的记录")returnitem_data = self.tree.item(selected_item, "values")confirm = messagebox.askyesno("确认删除",f"确定要永久删除这条记录吗?\n\n时间:{item_data[0]}\n内容:{item_data[1]}")if not confirm:returntry:wb = openpyxl.load_workbook(FILE_PATH)ws = wb.active# 精确匹配删除found = Falsefor 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 = Truebreakif 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()