Python实现技能记录系统
Python实现技能记录系统
来自网络,有改进。
技能记录系统界面如下:
具有保存图片和显示功能——允许用户选择图片保存,选择历史记录时若有图片可预览图片。
这个程序的数据保存在数据库skills2.db中,此数据库由用Python 自带的sqlite3数据库管理系统(不需要单独安装)管理,由程序自动维护(不需要用户操心),和程序文件在同一文件夹中。
“查看/编辑总结”的窗口上,有一个复选框 “允许编辑”,默认不选中 ,因此打开编辑总结的窗口时“保存”按钮处于不可用(灰色)状态,不能编辑文字,只有选中“允许编辑”复选框,方可编辑文字、保存。
此窗口设置为模态——确保用户完成编辑操作后才能返回主窗口。
本程序涉及如下模块/库
需要安装的库:Pillow (PIL)(通过 pip install pillow 安装)
Pillow (PIL) 是一个图像处理库,是第三方库,需要安装。用于处理图像文件。代码中使用了 Image 和 ImageTk,这些是 Pillow 的功能模块。
以下是 Python 标准库的一部分,通常不需要单独安装:
datetime:用于处理日期和时间。
io:用于处理输入输出流。
tkinter:用于创建图形用户界面。
sqlite3:用于操作 SQLite 数据库。
源码如下(部分代码参考自网络):
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
import sqlite3
from datetime import datetime
from PIL import Image, ImageTk
import ioclass SkillTracker:def __init__(self, root):self.root = rootself.root.title("技能记录系统 v1.2.1")self.root.geometry("1500x760+0+0")self.conn = sqlite3.connect('skills2.db')self.c = self.conn.cursor()self.init_db()self.create_widgets()self.load_data()self.root.protocol("WM_DELETE_WINDOW", self.on_close)def init_db(self):try:self.c.execute('''CREATE TABLE IF NOT EXISTS skills(id INTEGER PRIMARY KEY, name TEXT NOT NULL, parent_id INTEGER,path TEXT UNIQUE)''')self.c.execute('''CREATE TABLE IF NOT EXISTS records(id INTEGER PRIMARY KEY,skill_path TEXT NOT NULL,score INTEGER CHECK(score BETWEEN 1 AND 10),date DATE DEFAULT CURRENT_DATE,summary TEXT,image BLOB)''')self.conn.commit()except sqlite3.Error as e:messagebox.showerror("数据库错误", f"初始化失败: {str(e)}")def add_category(self):"""添加大类"""name = self.get_input("新建大类名称:")if name:try:self.c.execute("INSERT INTO skills (name, path) VALUES (?, ?)",(name, name))skill_id = self.c.lastrowidself.conn.commit()# 更新树形控件self.tree.insert("", "end", iid=skill_id, text=name, open=True)return Trueexcept sqlite3.IntegrityError:messagebox.showerror("错误", "技能名称已存在")except sqlite3.Error as e:messagebox.showerror("数据库错误", f"添加失败: {str(e)}")return False def delete_item(self):"""删除选中的技能项及其子项"""selected = self.tree.selection()if not selected:messagebox.showerror("错误", "请先选择要删除的项")returnitem_id = selected[0]item_name = self.tree.item(item_id)['text']# 确认对话框if not messagebox.askyesno("确认删除", f"确定要删除【{item_name}】及其所有子项吗?"):return# 递归删除数据库记录def delete_from_db(skill_id):self.c.execute("SELECT id FROM skills WHERE parent_id=?", (skill_id,))children = self.c.fetchall()for child in children:delete_from_db(child[0])self.c.execute("DELETE FROM skills WHERE id=?", (skill_id,))delete_from_db(item_id)self.conn.commit()self.tree.delete(item_id)messagebox.showinfo("成功", "删除完成")def delete_history(self):selected = self.history_tree.selection()if not selected:messagebox.showwarning("提示", "请先选择要删除的记录")returnrecord_id = self.history_tree.item(selected[0], "values")[0]if not messagebox.askyesno("确认删除", "确定要删除这条记录吗?"):returntry:self.c.execute("DELETE FROM records WHERE id=?", (record_id,))self.conn.commit()self.history_tree.delete(selected[0])messagebox.showinfo("成功", "记录已删除")# 清除图片预览self.image_preview.config(image="")self.image_preview.image = Noneself.image_data = Noneexcept sqlite3.Error as e:messagebox.showerror("数据库错误", f"删除失败: {str(e)}")def load_data(self):"""加载初始数据"""self.load_skill_tree()self.load_history()def on_close(self):"""统一的关闭处理"""try:self.conn.commit()self.conn.close()except Exception as e:passfinally:self.root.destroy()def create_widgets(self):# 左侧技能树面板left_frame = ttk.Frame(self.root)left_frame.pack(side=tk.LEFT, fill=tk.Y, padx=10, pady=10)self.tree = ttk.Treeview(left_frame, show="tree")self.tree.pack(fill=tk.Y, expand=True)btn_frame = ttk.Frame(left_frame)ttk.Button(btn_frame, text="添加大类", command=self.add_category).pack(side=tk.LEFT, padx=2)ttk.Button(btn_frame, text="添加子项", command=self.add_subskill).pack(side=tk.LEFT, padx=2)ttk.Button(btn_frame, text="删除项", command=self.delete_item).pack(side=tk.LEFT, padx=2)btn_frame.pack(pady=5)# 中间输入面板center_frame = ttk.Frame(self.root)center_frame.pack(side=tk.LEFT, fill=tk.BOTH, expand=True, padx=10, pady=10)input_frame = ttk.LabelFrame(center_frame, text="今日录入")input_frame.pack(fill=tk.X, pady=5)ttk.Label(input_frame, text="当前技能:").grid(row=0, column=0, sticky=tk.W)self.selected_skill = ttk.Label(input_frame, text="未选择", foreground="blue")self.selected_skill.grid(row=0, column=1, sticky=tk.W)ttk.Label(input_frame, text="分数/等级 (1-10):").grid(row=1, column=0, sticky=tk.W)self.score_var = tk.IntVar()ttk.Spinbox(input_frame, from_=1, to=10, textvariable=self.score_var, width=5).grid(row=1, column=1)ttk.Label(input_frame, text="学习总结:").grid(row=2, column=0, sticky=tk.NW)self.summary_text = tk.Text(input_frame, height=8, width=40)self.summary_text.grid(row=2, column=1, pady=5)ttk.Button(input_frame, text="上传图片", command=self.upload_image).grid(row=3, column=0, pady=5)ttk.Button(input_frame, text="保存记录", command=self.save_record).grid(row=3, column=1, pady=5)# 图片预览区域(放在今日录入框下方)self.image_preview = ttk.Label(center_frame)self.image_preview.pack(pady=10)self.image_data = None# 右侧历史记录面板history_frame = ttk.Frame(self.root)history_frame.pack(side=tk.RIGHT, fill=tk.BOTH, expand=True, padx=10, pady=10)btn_frame = ttk.Frame(history_frame)ttk.Button(btn_frame, text="删除记录", command=self.delete_history).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="查找记录", command=self.search_records).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="全部记录", command=self.load_history).pack(side=tk.LEFT, padx=5)ttk.Button(btn_frame, text="查看/编辑总结", command=self.edit_record).pack(side=tk.LEFT, padx=5)btn_frame.pack(fill=tk.X, pady=5)columns = ("id", "date", "skill", "score", "summary")self.history_tree = ttk.Treeview(history_frame,columns=columns,show="headings",selectmode="browse")# 配置可见列self.history_tree.heading("date", text="日期")self.history_tree.heading("skill", text="技能路径")self.history_tree.heading("score", text="评分/评级")self.history_tree.heading("summary", text="总结")# 配置列参数self.history_tree.column("date", width=120, anchor="center")self.history_tree.column("skill", width=200)self.history_tree.column("score", width=80, anchor="center")self.history_tree.column("summary", width=300)# 隐藏ID列self.history_tree.column("id", width=0, stretch=tk.NO)# 滚动条scrollbar = ttk.Scrollbar(history_frame, orient="vertical", command=self.history_tree.yview)self.history_tree.configure(yscrollcommand=scrollbar.set)# 布局self.history_tree.pack(side=tk.TOP, fill=tk.BOTH, expand=True)scrollbar.pack(side=tk.RIGHT, fill=tk.Y)# 绑定选择事件self.history_tree.bind("<<TreeviewSelect>>", self.on_history_select)self.tree.bind("<<TreeviewSelect>>", self.on_skill_select)def upload_image(self):file_path = filedialog.askopenfilename(filetypes=[("Image files", "*.png *.jpg *.jpeg *.gif *.bmp")])if file_path:with open(file_path, "rb") as file:self.image_data = file.read()self.display_image(self.image_preview, self.image_data, (400, 400)) # 调整大小以适应您的布局def display_image(self, label, image_data, size):if image_data:image = Image.open(io.BytesIO(image_data))image.thumbnail(size)photo = ImageTk.PhotoImage(image)label.config(image=photo)label.image = photoelse:label.config(image="")label.image = Nonedef add_subskill(self):"""添加子技能(修正后的版本)"""selected = self.tree.selection()if not selected:messagebox.showerror("错误", "请先选择父级技能")returnparent_id = selected[0]name = self.get_input("新建子项名称:")if name:parent_path = self.get_skill_path(parent_id)new_path = f"{parent_path}/{name}"try:# 使用self.c和self.connself.c.execute("INSERT INTO skills (name, parent_id, path) VALUES (?,?,?)",(name, parent_id, new_path))self.conn.commit()skill_id = self.c.lastrowidself.tree.insert(parent_id, "end", iid=skill_id, text=name)except sqlite3.Error as e:messagebox.showerror("数据库错误", f"添加失败: {str(e)}")def load_skill_tree(self):"""技能树加载"""try:self.tree.delete(*self.tree.get_children())# 获取所有技能并按层级排序self.c.execute('''WITH RECURSIVE skill_tree(id, name, parent_id, depth) AS (SELECT id, name, parent_id, 0FROM skills WHERE parent_id IS NULLUNION ALLSELECT s.id, s.name, s.parent_id, st.depth + 1FROM skills sJOIN skill_tree st ON s.parent_id = st.id)SELECT * FROM skill_tree ORDER BY depth, parent_id''')# 创建临时存储父节点的字典nodes = {}for skill_id, name, parent_id, _ in self.c.fetchall():if parent_id is None:node = self.tree.insert("", "end", iid=skill_id, text=name)else:parent = nodes.get(parent_id)if parent:node = self.tree.insert(parent, "end", iid=skill_id, text=name)nodes[skill_id] = skill_id # 保存节点IDexcept sqlite3.Error as e:messagebox.showerror("数据库错误", f"加载技能树失败: {str(e)}")def save_record(self):skill_path = self.selected_skill['text']if skill_path == "未选择":messagebox.showerror("错误", "请先选择一个技能")returntry:score = self.score_var.get()if not 1 <= score <= 10:raise ValueErrorexcept:messagebox.showerror("错误", "请输入1-10之间的整数")returnsummary = self.summary_text.get("1.0", tk.END).strip()date = datetime.now().strftime("%Y-%m-%d")try:self.c.execute("INSERT INTO records (skill_path, score, date, summary, image) VALUES (?,?,?,?,?)",(skill_path, score, date, summary, self.image_data))self.conn.commit()messagebox.showinfo("成功", "记录已保存!")self.summary_text.delete("1.0", tk.END)self.image_data = Noneself.image_preview.config(image="")self.image_preview.image = Noneself.load_history()except sqlite3.Error as e:messagebox.showerror("数据库错误", f"保存失败: {str(e)}")def load_history(self):try:self.history_tree.delete(*self.history_tree.get_children())self.c.execute("SELECT id, date, skill_path, score, summary FROM records ORDER BY date DESC, id DESC")for record in self.c.fetchall():self.history_tree.insert("", "end", values=record)except sqlite3.Error as e:messagebox.showerror("数据库错误", f"加载失败: {str(e)}")def on_history_select(self, event):selected = self.history_tree.selection()if selected:record_id = self.history_tree.item(selected[0], "values")[0]self.c.execute("SELECT image FROM records WHERE id=?", (record_id,))result = self.c.fetchone()if result:image_data = result[0]self.display_image(self.image_preview, image_data, (400, 400))else:self.image_preview.config(image="")self.image_preview.image = Nonedef get_skill_path(self, item_id):"""获取技能完整路径"""path = []while item_id:item = self.tree.item(item_id)path.append(item['text'])item_id = self.tree.parent(item_id)return '/'.join(reversed(path))def on_skill_select(self, event):selected = self.tree.selection()if selected:path = self.get_skill_path(selected[0])self.selected_skill.config(text=path)def get_input(self, prompt):"""获取用户输入"""dialog = tk.Toplevel()dialog.title("输入")ttk.Label(dialog, text=prompt).pack(padx=10, pady=5)entry = ttk.Entry(dialog)entry.pack(padx=10, pady=5)result = []def on_ok():result.append(entry.get())dialog.destroy()ttk.Button(dialog, text="确定", command=on_ok).pack(pady=5)dialog.wait_window()return result[0] if result else Nonedef search_records(self):search_window = tk.Toplevel(self.root)search_window.title("查找记录")ttk.Label(search_window, text="日期 (YYYY-MM-DD):").grid(row=0, column=0, padx=5, pady=5)date_entry = ttk.Entry(search_window)date_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(search_window, text="技能路径:").grid(row=1, column=0, padx=5, pady=5)skill_entry = ttk.Entry(search_window)skill_entry.grid(row=1, column=1, padx=5, pady=5)def perform_search():date = date_entry.get()skill = skill_entry.get()query = "SELECT id, date, skill_path, score, summary FROM records WHERE 1=1"params = []if date:query += " AND date = ?"params.append(date)if skill:query += " AND skill_path LIKE ?"params.append(f"%{skill}%")query += " ORDER BY date DESC"try:self.c.execute(query, params)results = self.c.fetchall()self.history_tree.delete(*self.history_tree.get_children())for record in results:self.history_tree.insert("", "end", values=record)search_window.destroy()except sqlite3.Error as e:messagebox.showerror("查询错误", str(e))ttk.Button(search_window, text="查找", command=perform_search).grid(row=2, column=0, columnspan=2, pady=10)def edit_record(self):selected = self.history_tree.selection()if not selected:messagebox.showwarning("提示", "请先选择要 查看/编辑 的记录")returnrecord_id = self.history_tree.item(selected[0], "values")[0]# 获取当前记录信息self.c.execute("SELECT summary FROM records WHERE id=?", (record_id,))current_summary = self.c.fetchone()[0]edit_window = tk.Toplevel(self.root)edit_window.title(" 查看/编辑 记录")edit_window.geometry("400x300+360+280")ttk.Label(edit_window, text=" 查看/编辑 总结:").pack(padx=5, pady=5)summary_text = tk.Text(edit_window, height=8, width=40)summary_text.pack(padx=5, pady=5)summary_text.insert(tk.END, current_summary)summary_text.config(state='disabled') # 初始状态设为禁用save_button = ttk.Button(edit_window, text="保存", state='disabled')save_button.pack(pady=10)def toggle_edit_state():if allow_edit_var.get():summary_text.config(state='normal')save_button.config(state='normal')else:summary_text.config(state='disabled')save_button.config(state='disabled')def save_edit():new_summary = summary_text.get("1.0", tk.END).strip()try:self.c.execute("UPDATE records SET summary=? WHERE id=?", (new_summary, record_id))self.conn.commit()messagebox.showinfo("成功", "记录已更新")edit_window.destroy()self.load_history() # 刷新显示except sqlite3.Error as e:messagebox.showerror("数据库错误", f"更新失败: {str(e)}")# 添加允许编辑的复选框allow_edit_var = tk.BooleanVar()allow_edit_checkbox = ttk.Checkbutton(edit_window, text="允许编辑", variable=allow_edit_var, command=toggle_edit_state)allow_edit_checkbox.pack(pady=5)save_button.config(command=save_edit)# 添加取消按钮ttk.Button(edit_window, text="取消", command=edit_window.destroy).pack(pady=5)# 使窗口成为模态窗口edit_window.transient(self.root)edit_window.grab_set()self.root.wait_window(edit_window)if __name__ == "__main__":root = tk.Tk()app = SkillTracker(root)root.mainloop()
相关文章:

Python实现技能记录系统
Python实现技能记录系统 来自网络,有改进。 技能记录系统界面如下: 具有保存图片和显示功能——允许用户选择图片保存,选择历史记录时若有图片可预览图片。 这个程序的数据保存在数据库skills2.db中,此数据库由用Python 自带的…...
前端基础之《Vue(10)—过滤器》
一、过滤器 1、作用 用于数据处理。 2、全局过滤器 使用Vue.filter(名称, val>{return newVal})定义。 在任何组件中都可以直接使用。 3、局部过滤器 使用选项,filters: {}定义,只能在当前组件中使用。 4、过滤器在Vue 3.0中已经淘汰了 5、过滤器…...

Linux常见指令介绍下(入门级)
1. head head就和他的名字一样,是显示一个文件头部的内容(会自动排序),默认是打印前10行。 语法:head [参数] [文件] 选项: -n [x] 显示前x行。 2. tail tail 命令从指定点开始将文件写到标准输出.使用t…...

VIC-3D非接触全场应变测量系统用于小尺寸测量之电子元器件篇—研索仪器DIC数字图像相关技术
在5G通信、新能源汽车电子、高密度集成电路快速迭代的今天,电子元件的尺寸及连接工艺已进入亚毫米级竞争阶段,这种小尺寸下的力学性能评估对测量方式的精度有更高的要求,但传统应变测量手段常因空间尺寸限制及分辨率不足难以捕捉真实形变场。…...
字典与集合——测试界的黑话宝典与BUG追捕术
主题:“字典是测试工程师的暗号手册,集合是BUG的照妖镜” 一、今日目标 ✅ 掌握字典的「键值对暗号体系」与集合的「去重妖法」✅ 开发《测试工程师黑话词典》,让新人秒变老司机✅ 统计自动化测试结果中的高频BUG类型(附赠甩锅指…...

下篇:深入剖析 BLE GATT / GAP / SMP 与应用层(约5000字)
引言 在 BLE 协议栈的最上层,GAP 定义设备角色与连接管理,GATT 构建服务与特征,SMP 负责安全保障,应用层则承载具体业务逻辑与 Profile。掌握这一层,可实现安全可靠的设备发现、配对、服务交互和定制化业务。本文将详解 GAP、GATT、SMP 三大模块,并通过示例、PlantUML 时…...
事务详细介绍
一、简介 1、什么是事务 事务是指一组操作,这些操作要么全部成功执行,要么全部不执行,保证数据的完整性和一致性。事务广泛应用于数据库管理系统、分布式系统和企业级应用中; 2、事务的特性 事务具有四个基本特性,…...
PostgreSQL 中的权限视图
PostgreSQL 中的权限视图 PostgreSQL 提供了多个系统视图来查询权限信息,虽然不像 Oracle 的 DBA_SYS_PRIVS 那样集中在一个视图中,但可以通过组合以下视图获取完整的系统权限信息。 一 主要权限相关视图 Oracle 视图PostgreSQL 对应视图描述DBA_SYS_…...
Python-36:饭馆菜品选择问题
问题描述 小C来到了一家饭馆,这里共有 nn 道菜,第 ii 道菜的价格为 a_i。其中一些菜中含有蘑菇,s_i 代表第 ii 道菜是否含有蘑菇。如果 s_i 1,那么第 ii 道菜含有蘑菇,否则没有。 小C希望点 kk 道菜,且希…...

27、Session有什么重⼤BUG?微软提出了什么⽅法加以解决?
Session的重大BUG 1、进程回收导致Session丢失 原理: IIS的进程回收机制会在系统繁忙、达到特定内存阈值等情况下,自动回收工作进程(w3wp.exe)。由于Session数据默认存储在进程内存中,进程回收时这些数据会被清除。 …...
图论---Bellman-Ford算法
适用场景:有边数限制 ->(有负环也就没影响了),存在负权边,O( n * m ); 有负权回路时有的点距离会是负无穷,因此最短路存在的话就说明没有负权回路。 从1号点经过不超过k条边到每个点的距离…...
复杂性决策-思维训练
思维训练 1.模式识别 观察、复杂、不确定、波动、模糊 –找出必要和非必要因素 –识别重大威胁和机遇 2.系统分析 为复杂情景构建系统心智模型 利用模型识别模式做出预测,指定有效策略 3.心智敏锐度 利用不同层次的分析探索挑战的能力,对其他利益相关方在…...

云智融合普惠大模型AI,政务服务重构数智化路径
2025年是“十四五”收官之年,数字政府和政务数智化作为“数字中国”建设的重点,已经取得了显著成效。根据《联合国电子政务调查报告2024》,我国电子政务发展指数全球排名第35位,与2022年相比提升8个名次;其中ÿ…...
反爬系列 IP 限制与频率封禁应对指南
在数据采集领域,IP 限制与频率封禁是反爬机制中最常见的防御手段。随着网站安全策略的升级,单靠传统爬虫技术已难以应对高强度的检测。本文将从反爬机制解析、实战应对策略两个维度,系统讲解如何突破 IP 限制与频率封禁。 一、反爬机制解析 …...
Redis Cluster 使用 CRC16 算法实现 Slot 槽位分片的核心细节
一、CRC16 算法作用原理 哈希计算流程 对键值(Key)执行 CRC16 算法,生成 16 位校验值(0~65535)。 将校验值 对 16384 取模(公式:slot CRC16(key) % 16384),…...
Java基础集合 面试经典八股总结 [连载ing]
序言 八股,怎么说呢。我之前系统学习的内容,进行梳理。通过问题的方式,表达出得当的内容,这件事本身就很难。面试时心态、状态、掌握知识的情况等。关于八股文,我不想有太多死记硬背的内容,更多的是希望自我…...
如何将极狐GitLab 议题导出为 CSV?
极狐GitLab 是 GitLab 在中国的发行版,关于中文参考文档和资料有: 极狐GitLab 中文文档极狐GitLab 中文论坛极狐GitLab 官网 导出议题到 CSV (BASIC ALL) 您可以将问题从极狐GitLab 导出为 CSV 文件,这些文件将作为附件发送到您的默认通知…...

UE5 调整字体、界面大小
文章目录 方案一 5.4 版本及以上(推荐)方案二 5.3 版本及以下(推荐)方案三 使用插件(不推荐) 方案一 5.4 版本及以上(推荐) 进入 编辑 > 编辑器偏好设置,如下图所示&…...
Android Cordova 开发 - Cordova 快速入门(Cordova 环境配置、Cordova 第一个应用程序)
一、Cordova 1、Cordova 概述 Cordova 是使用 HTML,CSS 和 JavaScript 构建混合移动应用程序的平台 2、Cordova 特征 (1)命令行界面(Cordova CLI) 这是可用于启动项目,构建不同平台的进程,…...
Docker Compose 和 Kubernetes(k8s)区别
前言:Docker Compose 和 Kubernetes(k8s)是容器化技术中两个常用的工具,但它们的定位、功能和适用场景有显著区别。以下是两者的核心对比: 1. 定位与目标 特性 Docker Compose Kubernet…...

抽象类相关
抽象类的定义 抽象类 是一种特殊的类,它不能被实例化,只能作为基类来派生出具体类。抽象类至少包含一个纯虚函数 。纯虚函数是在函数原型前加上 0 的虚函数,表示该函数没有具体实现,必须由派生类来实现。 抽象类的作用 提供统…...
十分钟恢复服务器攻击——群联AI云防护系统实战
场景描述 服务器遭遇大规模DDoS攻击,导致服务不可用。通过群联AI云防护系统的分布式节点和智能调度功能,快速切换流量至安全节点,清洗恶意流量,10分钟内恢复业务。 技术实现步骤 1. 启用智能调度API触发节点切换 群联系统提供RE…...
鸿蒙NEXT开发网络相关工具类(ArkTs)
import { connection } from kit.NetworkKit; import { BusinessError, Callback } from kit.BasicServicesKit; import { wifiManager } from kit.ConnectivityKit; import { LogUtil } from ./LogUtil; import { data, radio, sim } from kit.TelephonyKit;// 网络类型枚举 e…...
【上位机——MFC】MFC入门
MFC库中相关类简介 CObject MFC类库中绝大部分类的父类,提供了MFC类库中一些基本的机制。 对运行时类信息的支持。对动态创建的支持。对序列化的支持。 CWinApp 应用程序类,封装了应用程序、线程等信息。 CDocument 文档类,管理数据 F…...
全面介绍AVFilter 的添加和使用
author: hjjdebug date: 2025年 04月 22日 星期二 13:48:19 CST description: 全面介绍AVFilter 的添加和使用 文章目录 1.两个重要的编码思想1. 写代码不再是我们调用别人,而是别人调用我们!2. 面向对象的编程方法. 2. AVFilter 开发流程2.1 编写AVFilter 文件2.1.…...

【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建
本文章同步到我的个人博客网站:ElemenX-King:【UVM项目实战】异步fifo—uvm项目结构以及uvm环境搭建 希望大家能使用此网站来进行浏览效果更佳!!! 目录 一、异步FIFO1.1 异步FIFO的定义1.2 亚稳态1.3 异步FIFO关键技术…...

【通关函数的递归】--递归思想的形成与应用
目录 一.递归的概念与思想 1.定义 2.递归的思想 3.递归的限制条件 二.递归举例 1.求n的阶乘 2.顺序打印一个整数的每一位 三.递归与迭代 前言:上篇博文分享了扫雷游戏的实现,这篇文章将会继续分享函数的递归相关知识点,让大家了解并掌握递归的思…...
AI日报 - 2025年04月25日
🌟 今日概览(60秒速览) ▎🤖 AGI突破 | OpenAI o3模型展现行动能力,英国发布RepliBench评估AI自主复制风险,DeepMind CEO担忧AGI协调挑战。 模型能力向行动和自主性演进,安全与协调成为焦点。 ▎💼 商业动向…...

【FAQ】针对于消费级NVIDIA GPU的说明
概述 本文概述 HP Anyware 在配备消费级 NVIDIA GPU 的物理工作站上的关键组件、安装说明和重要注意事项。 注意:本文档适用于 NVIDIA 消费级 GPU。NVIDIA Quadro 和 Tesla GPU 也支持 HP Anyware 在公有云、虚拟化或物理工作站环境中运行。请参阅PCoIP Graphi…...
几种查看PyTorch、cuda 和 Python 版本方法
在检查 PyTorch、cuda 和 Python 版本时,除了直接使用 torch.__version__ 和 sys.version,我们还可以通过其他方式实现相同的功能 方法 1:直接访问属性(原始代码) import torch import sysprint("PyTorch Versi…...