【开发学习】如何使用deepseek创建记录事件时间的PC应用程序

news2025/3/11 7:15:45

本文记录了尝试使用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. 检查打包文件

  1. 打包完成后:

    • 打开项目文件夹中的 dist 子文件夹
    • 找到生成的 TextRecorder.exe 文件
  2. 测试运行:

    • 双击运行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()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2313101.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OSPF-单区域的配置

一、单区域概念&#xff1a; 单区域OSPF中&#xff0c;整个网络被视为一个区域&#xff0c;区域ID通常为0&#xff08;骨干区域&#xff09;。所有的路由器都在这个区域内交换链路状态信息。 补充知识点&#xff1a; OSPF为何需要loopback接口&#xff1a; 1.Loopback接口的…

【2025力扣打卡系列】0-1背包 完全背包

坚持按题型打卡&刷&梳理力扣算法题系列&#xff0c;语言为python3&#xff0c;Day5 0-1背包【目标和】 有n个物品&#xff0c;第i个物品的体积为w[i], 价值为v[i]。每个物品至多选一个&#xff0c;求体积和不超过capacity时的最大价值和常见变形 至多装capacity&#x…

分布式锁—Redisson的同步器组件

1.Redisson的分布式锁简单总结 Redisson分布式锁包括&#xff1a;可重入锁、公平锁、联锁、红锁、读写锁。 (1)可重入锁RedissonLock 非公平锁&#xff0c;最基础的分布式锁&#xff0c;最常用的锁。 (2)公平锁RedissonFairLock 各个客户端尝试获取锁时会排队&#xff0c;按照队…

OpenEuler24.x下ZABBIX6/7实战1:zabbix7.2.4安装及zabbix-agent安装

兰生幽谷&#xff0c;不为莫服而不芳&#xff1b; 君子行义&#xff0c;不为莫知而止休。 1 安装及准备 先决条件&#xff1a;建议使用CentOS8以上的操作系统。 CentOS8.5.2111内核版本为 图1- 1 华为OpenEuler24(以后简称OE24)的内核为 [rootzbxsvr ~]# uname -r 5.10.0-…

ROS实践一构建Gazebo机器人模型文件urdf

URDF&#xff08;Unified Robot Description Format&#xff09;是一种基于XML的格式&#xff0c;用于描述机器人模型的结构、关节、连杆和传感器信息&#xff0c;并可以与Gazebo、RViz等仿真环境结合使用。 一、基础语法 1. urdf文件组成 URDF 主要由以下几个核心元素&#…

C++学习——哈希表(一)

文章目录 前言一、哈希表的模板代码二、哈希计数器三、哈希表中的无序映射四、哈希表的总结 前言 本文为《C学习》的第11篇文章&#xff0c;今天学习最后一个数据结构哈希表&#xff08;散列表&#xff09;。 一、哈希表的模板代码 #include<iostream> using namespace…

DeepSeek R1在医学领域的应用与技术分析(Discuss V1版)

DeepSeek R1作为一款高性能、低成本的国产开源大模型,正在深刻重塑医学软件工程的开发逻辑与应用场景。其技术特性,如混合专家架构(MoE)和参数高效微调(PEFT),与医疗行业的实际需求紧密结合,推动医疗AI从“技术驱动”向“场景驱动”转型。以下从具体业务领域需求出发,…

Git 如何配置多个远程仓库和免密登录?

自我简介&#xff1a;4年导游&#xff0c;10年程序员&#xff0c;最近6年一直深耕低代码领域&#xff0c;分享低代码和AI领域见解。 通用后台管理系统 代号&#xff1a;虎鲸 缘由 每次开发后台界面都会有很多相同模块&#xff0c;尝试抽离出公共模块作为快速开发的基座。 目标…

【Linux篇】从冯诺依曼到进程管理:计算机体系与操作系统的核心逻辑

&#x1f4cc; 个人主页&#xff1a; 孙同学_ &#x1f527; 文章专栏&#xff1a;Liunx &#x1f4a1; 关注我&#xff0c;分享经验&#xff0c;助你少走弯路&#xff01; 文章目录 1.冯诺依曼体系结构存储分级理解数据流动 2. 操作系统(Operator System)2.1 概念2.2 设计OS的…

【Linux docker】关于docker启动出错的解决方法。

无论遇到什么docker启动不了的问题 就是 查看docker状态sytemctl status docker查看docker日志sudo journalctl -u docker.service查看docker三个配置文件&#xff1a;/etc/docker/daemon.json&#xff08;如果存在&#xff09; /etc/systemd/system/docker.service&#xff…

【医院内部控制专题】7.医院内部控制环境要素剖析(三):人力资源政策

医院成本核算、绩效管理、运营统计、内部控制、管理会计专题索引 一、引言 在当今医疗行业竞争日益激烈的背景下,医院内部控制的重要性愈发凸显。内部控制作为医院管理的关键组成部分,对于保障医院资产安全、提高会计信息质量、提升运营效率以及实现战略目标起着至关重要的…

计算机网络——交换机

一、什么是交换机&#xff1f; 交换机&#xff08;Switch&#xff09;是局域网&#xff08;LAN&#xff09;中的核心设备&#xff0c;负责在 数据链路层&#xff08;OSI第二层&#xff09;高效转发数据帧。它像一位“智能交通警察”&#xff0c;根据设备的 MAC地址 精准引导数…

CentOS7离线部署安装Dify

离线部署安装Dify 在安装 Dify 之前&#xff0c;请确保您的机器满足以下最低系统要求&#xff1a; CPU > 2 核 内存 > 4 GiB 1.安装docker和docker compose 启动 Dify 服务器最简单的方式是通过docker compose。因此现在服务器上安装好docker和docker compose&#xf…

力扣hot100_二叉树(4)_python版本

一、199. 二叉树的右视图 思路&#xff1a; 直接复用层序遍历的代码&#xff0c;然后取每层的最后一个节点代码&#xff1a; class Solution:def rightSideView(self, root: Optional[TreeNode]) -> List[int]:层序遍历取每层的第一个if not root: return []res []queue …

bug-Ant中a-select的placeholder不生效(绑定默认值为undefined)

1.问题 Ant中使用a-select下拉框时&#xff0c;placeholder设置输入框显示默认值提示&#xff0c;vue2ant null与undefined在js中明确的区别&#xff1a; null&#xff1a;一个值被定义&#xff0c;定义为“空值” undefined&#xff1a;根本不存在定义 2.解决 2.1 a-select使…

颠覆语言认知的革命!神经概率语言模型如何突破人类思维边界?

颠覆语言认知的革命&#xff01;神经概率语言模型如何突破人类思维边界&#xff1f; 一、传统模型的世纪困境&#xff1a;当n-gram遇上"月光族难题" 令人震惊的案例&#xff1a;2012年Google语音识别系统将 用户说&#xff1a;“我要还信用卡” 系统识别&#xff…

练习:关于静态路由,手工汇总,路由黑洞,缺省路由相关

这是题目,我已经画分好了网段,题目要求是这样的: 划分网段 我为什么一个网段划了6个可用IP(一个网段8个地址)呢,因为我刚开始吧环回接口理解成一个主机了,导致我认为两个环回主机在一个网段,其实每个网段只需要2个地址就可以完成这个练习,我懒得划了,就按第一张图的网段来吧…

J6打卡——pytorch实现ResNeXt-50实现猴痘检测

&#x1f368; 本文为&#x1f517;365天深度学习训练营中的学习记录博客 &#x1f356; 原作者&#xff1a;K同学啊 1.检查GPU import torch import torch.nn as nn import torchvision.transforms as transforms import torchvision from torchvision import transforms, d…

vue+dhtmlx-gantt 实现甘特图-快速入门【甘特图】

文章目录 一、前言二、使用说明2.1 引入依赖2.2 引入组件2.3 引入dhtmlx-gantt2.4 甘特图数据配置2.5 初始化配置 三、代码示例3.1 Vue2完整示例3.2 Vue3 完整示例 四、效果图 一、前言 dhtmlxGantt 是一款功能强大的甘特图组件&#xff0c;支持 Vue 3 集成。它提供了丰富的功…

音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构

一、引言 《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式&#xff0c;这两个文档都可以从RFC官网下载&#xff1a; RFC Editor 本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页&#xff0c;本文下面所说的“页数”是指在pdf阅读…