Python项目源码69:Excel数据筛选器1.0(tkinter+sqlite3+pandas)

功能说明:以下是一个使用Tkinter和Pandas实现的完整示例,支持Excel数据读取、双表格展示和高级条件筛选功能:

1.文件操作:点击"打开文件"按钮选择Excel文件(支持.xlsx和.xls格式),自动加载数据到左侧表格。输入Pandas兼容的查询条件,点击"执行筛选"查看结果,点击"清空条件"重置筛选结果。

2.数据展示:左侧表格显示原始数据,右侧表格显示筛选结果,自动适应列宽,支持垂直滚动。

3.高级筛选:数值比较:Age >= 25,字符串包含:Name.str.contains(“张”),多条件组合:(Salary > 8000) & (Department == “销售部”),日期筛选:Join_Date > “2023-01-01”,在条件输入框使用Pandas查询语法,例如:点击"执行筛选"按钮应用条件,点击"清空条件"按钮重置筛选。

4.错误处理:文件读取错误提示,条件语法错误提示,空条件警告。

5.数据库保存功能:原始数据(JSON格式),保存时间戳(精确到秒),新增"保存结果"按钮,自动创建SQLite数据库文件(data_records.db),存储结构包含:每次保存记录当前系统时间。

6.数据库查看功能:点击"查看历史"按钮弹出历史记录窗口,显示保存时间和记录数量,双击条目可查看详细数据,详细数据显示原始保存的表格格式。

7.条件收藏功能:新增收藏条件按钮,支持为当前条件命名保存,下拉选择框可快速调用历史条件,自动同步数据库中的收藏条件。
在这里插入图片描述


# -*- coding: utf-8 -*-
# @Author : 小红牛
# 微信公众号:WdPython
import tkinter as tk
from tkinter import ttk, filedialog, messagebox, simpledialog
import pandas as pd
import sqlite3
from datetime import datetimeclass ExcelViewerApp:def __init__(self, root):self.root = rootself.root.title("Excel数据加载+分析1.0")self.df = pd.DataFrame()self.filtered_df = pd.DataFrame()self.saved_conditions = []# 初始化数据库self.init_db()self.load_saved_conditions()# 创建界面组件self.create_widgets()self.setup_layout()self.setup_style()def init_db(self):"""初始化数据库连接和表结构"""self.conn = sqlite3.connect('data_records.db')self.cursor = self.conn.cursor()# 结果表self.cursor.execute('''CREATE TABLE IF NOT EXISTS results(id INTEGER PRIMARY KEY AUTOINCREMENT,record_data TEXT,save_time TIMESTAMP)''')# 条件表(增加唯一约束)self.cursor.execute('''CREATE TABLE IF NOT EXISTS saved_conditions(id INTEGER PRIMARY KEY AUTOINCREMENT,condition_name TEXT UNIQUE,condition_expr TEXT,save_time TIMESTAMP)''')self.conn.commit()def load_saved_conditions(self):"""加载收藏条件"""self.cursor.execute("SELECT condition_name, condition_expr FROM saved_conditions ORDER BY save_time DESC")self.saved_conditions = self.cursor.fetchall()def create_widgets(self):"""创建所有界面组件"""# 工具栏self.toolbar = ttk.Frame(self.root)self.open_btn = ttk.Button(self.toolbar, text="打开文件", command=self.open_file)self.save_btn = ttk.Button(self.toolbar, text="保存数据", command=self.save_to_db)self.history_btn = ttk.Button(self.toolbar, text="查看数据", command=self.show_history)self.manage_btn = ttk.Button(self.toolbar, text="管理条件", command=self.manage_conditions)self.clear_btn = ttk.Button(self.toolbar, text="清空条件", command=self.clear_condition)# 条件输入区self.condition_frame = ttk.LabelFrame(self.root, text="筛选条件")self.condition_combo = ttk.Combobox(self.condition_frame,values=[c[0] for c in self.saved_conditions],width=25,state="readonly")self.condition_combo.bind("<<ComboboxSelected>>", self.select_condition)self.condition_entry = ttk.Entry(self.condition_frame, width=50)self.save_condition_btn = ttk.Button(self.condition_frame, text="收藏条件", command=self.save_condition)self.search_btn = ttk.Button(self.condition_frame, text="执行筛选", command=self.filter_data)# 示例条件文本框self.example_frame = ttk.LabelFrame(self.root, text="条件命令示例(cv可复制)")self.example_text = tk.Text(self.example_frame,height=3,width=60,wrap=tk.WORD,bg='#F7F7F7',relief=tk.FLAT)self.example_text.insert(tk.END,"1.数值比较:工资 >= 9000,工资 == 8000,工资.between(9000, 15000)\n""2.文本匹配:姓名.str.contains('张'),部门 == '市场部'\n""3.多条件:工资 >= 9000 & 入职日期 > '2025-01-18'\n")self.example_text.configure(state=tk.DISABLED)# 数据表格self.tree_frame = ttk.Frame(self.root)self.original_tree = ttk.Treeview(self.tree_frame, show="headings")self.result_tree = ttk.Treeview(self.tree_frame, show="headings")# 滚动条self.original_scroll = ttk.Scrollbar(self.tree_frame, orient="vertical", command=self.original_tree.yview)self.result_scroll = ttk.Scrollbar(self.tree_frame, orient="vertical", command=self.result_tree.yview)def setup_layout(self):"""布局组件"""# 工具栏self.toolbar.pack(fill=tk.X, padx=5, pady=5)self.open_btn.pack(side=tk.LEFT, padx=2)self.save_btn.pack(side=tk.LEFT, padx=2)self.history_btn.pack(side=tk.LEFT, padx=2)self.manage_btn.pack(side=tk.LEFT, padx=2)self.clear_btn.pack(side=tk.LEFT, padx=2)# 条件输入区self.condition_frame.pack(fill=tk.X, padx=5, pady=5)self.condition_combo.pack(side=tk.LEFT, padx=2)self.condition_entry.pack(side=tk.LEFT, fill=tk.X, expand=True, padx=2, pady=2)self.save_condition_btn.pack(side=tk.LEFT, padx=2)self.search_btn.pack(side=tk.LEFT, padx=2)# 示例文本框self.example_frame.pack(fill=tk.X, padx=5, pady=5)self.example_text.pack(padx=5, pady=5, fill=tk.BOTH, expand=True)# 表格区self.tree_frame.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)self.original_tree.grid(row=0, column=0, sticky="nsew")self.original_scroll.grid(row=0, column=1, sticky="ns")self.result_tree.grid(row=0, column=2, sticky="nsew")self.result_scroll.grid(row=0, column=3, sticky="ns")# 列权重self.tree_frame.columnconfigure(0, weight=1)self.tree_frame.columnconfigure(2, weight=1)self.tree_frame.rowconfigure(0, weight=1)def setup_style(self):"""配置界面样式"""style = ttk.Style()style.configure("Treeview", rowheight=28, font=('微软雅黑', 10))style.configure("Treeview.Heading", font=('微软雅黑', 10, 'bold'))style.configure("TButton", padding=6, font=('微软雅黑', 9))style.configure("TLabelFrame", font=('微软雅黑', 9, 'bold'))style.configure("TEntry", font=('微软雅黑', 10))def open_file(self):"""打开Excel文件并加载数据"""file_path = filedialog.askopenfilename(filetypes=[("Excel文件", "*.xlsx *.xls"), ("所有文件", "*.*")])if file_path:try:self.df = pd.read_excel(file_path)self.update_treeview(self.original_tree, self.df)messagebox.showinfo("成功", f"成功加载文件:{file_path}")except Exception as e:messagebox.showerror("错误", f"文件读取失败:{str(e)}")def update_treeview(self, tree, dataframe):"""更新Treeview组件显示数据"""# 清空现有数据tree.delete(*tree.get_children())# 配置列columns = list(dataframe.columns)tree["columns"] = columnsfor col in columns:tree.heading(col, text=col)tree.column(col, width=100, anchor="w", minwidth=50)# 插入数据for _, row in dataframe.iterrows():values = [self.format_value(v) for v in row.values]tree.insert("", "end", values=values)def format_value(self, value):"""格式化显示值"""if pd.isna(value):return ""if isinstance(value, (float, int)):return round(value, 4)if isinstance(value, datetime):return value.strftime("%Y-%m-%d")return str(value)[:50]  # 截断长字符串def filter_data(self):"""执行数据筛选"""condition = self.condition_entry.get().strip()if not condition:messagebox.showwarning("输入错误", "请输入筛选条件")returntry:self.filtered_df = self.df.query(condition, engine='python')self.update_treeview(self.result_tree, self.filtered_df)except Exception as e:messagebox.showerror("条件错误", f"无效的筛选条件:\n{str(e)}")def save_to_db(self):"""保存筛选结果到数据库"""if self.filtered_df.empty:messagebox.showwarning("保存错误", "没有可保存的筛选结果")returntry:# 转换为JSON格式json_data = self.filtered_df.to_json(orient='records', force_ascii=False)save_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")# 插入数据库self.cursor.execute("INSERT INTO results (record_data, save_time) VALUES (?, ?)",(json_data, save_time))self.conn.commit()messagebox.showinfo("保存成功",f"成功保存 {len(self.filtered_df)} 条记录\n保存时间:{save_time}")except Exception as e:messagebox.showerror("保存失败", f"数据库操作失败:{str(e)}")def show_history(self):"""显示历史记录窗口"""history_win = tk.Toplevel(self.root)history_win.title("历史保存记录")history_win.geometry("600x400")# 创建表格tree = ttk.Treeview(history_win, columns=("time", "count"), show="headings")tree.heading("time", text="保存时间")tree.heading("count", text="记录数")tree.column("time", width=200)tree.column("count", width=100, anchor="center")# 滚动条scroll = ttk.Scrollbar(history_win, orient="vertical", command=tree.yview)tree.configure(yscrollcommand=scroll.set)# 布局tree.pack(side=tk.LEFT, fill=tk.BOTH, expand=True)scroll.pack(side=tk.RIGHT, fill=tk.Y)# 加载数据self.cursor.execute("SELECT save_time, record_data FROM results ORDER BY save_time DESC")for save_time, data in self.cursor.fetchall():count = len(pd.read_json(data))display_time = datetime.strptime(save_time, "%Y-%m-%d %H:%M:%S").strftime("%Y-%m-%d %H:%M")tree.insert("", "end", values=(display_time, count))# 双击查看详情def on_double_click(event):selected = tree.selection()if selected:item = tree.item(selected[0])time_str = item["values"][0]self.show_history_detail(time_str)tree.bind("<Double-1>", on_double_click)def show_history_detail(self, time_str):"""显示历史记录详情"""detail_win = tk.Toplevel(self.root)detail_win.title(f"记录详情 - {time_str}")detail_win.geometry("800x600")# 查询数据库self.cursor.execute("SELECT record_data FROM results WHERE save_time LIKE ?",(f"{time_str}%",))result = self.cursor.fetchone()if not result:messagebox.showerror("错误", "找不到对应的记录数据")return# 创建表格df = pd.read_json(result[0])tree = ttk.Treeview(detail_win, show="headings")scroll_x = ttk.Scrollbar(detail_win, orient="horizontal", command=tree.xview)scroll_y = ttk.Scrollbar(detail_win, orient="vertical", command=tree.yview)tree.configure(xscrollcommand=scroll_x.set, yscrollcommand=scroll_y.set)# 配置列tree["columns"] = list(df.columns)for col in df.columns:tree.heading(col, text=col)tree.column(col, width=120, minwidth=80, anchor="w")# 插入数据for _, row in df.iterrows():values = [self.format_value(v) for v in row.values]tree.insert("", "end", values=values)# 布局tree.pack(side=tk.TOP, fill=tk.BOTH, expand=True)scroll_y.pack(side=tk.RIGHT, fill=tk.Y)scroll_x.pack(side=tk.BOTTOM, fill=tk.X)def save_condition(self):"""保存当前筛选条件"""condition = self.condition_entry.get().strip()if not condition:messagebox.showwarning("输入错误", "当前没有可保存的条件")return# 获取条件名称name = simpledialog.askstring("保存条件", "请输入条件名称:", parent=self.root)if not name:return# 检查重名self.cursor.execute("SELECT 1 FROM saved_conditions WHERE condition_name=?", (name,))if self.cursor.fetchone():messagebox.showerror("保存失败", "该名称已存在,请使用其他名称")returntry:# 插入数据库save_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")self.cursor.execute("INSERT INTO saved_conditions (condition_name, condition_expr, save_time) VALUES (?, ?, ?)",(name, condition, save_time))self.conn.commit()# 更新界面self.load_saved_conditions()self.condition_combo["values"] = [c[0] for c in self.saved_conditions]messagebox.showinfo("保存成功", "条件已成功收藏!")except Exception as e:messagebox.showerror("保存失败", f"数据库错误:{str(e)}")def select_condition(self, event):"""选择已保存的条件"""selected_name = self.condition_combo.get()for name, expr in self.saved_conditions:if name == selected_name:self.condition_entry.delete(0, tk.END)self.condition_entry.insert(0, expr)breakdef manage_conditions(self):"""打开条件管理窗口"""manage_win = tk.Toplevel(self.root)manage_win.title("管理收藏条件")manage_win.geometry("600x400")# 条件列表tree = ttk.Treeview(manage_win, columns=("name", "expr"), show="headings", selectmode="browse")tree.heading("name", text="条件名称")tree.heading("expr", text="条件表达式")tree.column("name", width=150)tree.column("expr", width=400)# 操作按钮btn_frame = ttk.Frame(manage_win)edit_btn = ttk.Button(btn_frame, text="编辑", command=lambda: self.edit_condition(tree, manage_win))delete_btn = ttk.Button(btn_frame, text="删除", command=lambda: self.delete_condition(tree))# 布局tree.pack(fill=tk.BOTH, expand=True, padx=5, pady=5)btn_frame.pack(pady=5)edit_btn.pack(side=tk.LEFT, padx=5)delete_btn.pack(side=tk.LEFT, padx=5)# 加载数据for name, expr in self.saved_conditions:tree.insert("", "end", values=(name, expr))def edit_condition(self, tree, parent_win):"""编辑选中条件"""selected = tree.selection()if not selected:messagebox.showwarning("提示", "请先选择一个条件")returnold_name, old_expr = tree.item(selected[0], "values")# 创建编辑对话框edit_win = tk.Toplevel(parent_win)edit_win.title("编辑条件")# 输入组件ttk.Label(edit_win, text="名称:").grid(row=0, column=0, padx=5, pady=5, sticky="e")name_entry = ttk.Entry(edit_win, width=30)name_entry.insert(0, old_name)name_entry.grid(row=0, column=1, padx=5, pady=5)ttk.Label(edit_win, text="表达式:").grid(row=1, column=0, padx=5, pady=5, sticky="e")expr_entry = ttk.Entry(edit_win, width=50)expr_entry.insert(0, old_expr)expr_entry.grid(row=1, column=1, padx=5, pady=5)def save_changes():new_name = name_entry.get().strip()new_expr = expr_entry.get().strip()if not new_name or not new_expr:messagebox.showwarning("输入错误", "名称和表达式不能为空")returntry:# 检查名称冲突if new_name != old_name:self.cursor.execute("SELECT 1 FROM saved_conditions WHERE condition_name=?", (new_name,))if self.cursor.fetchone():messagebox.showerror("错误", "名称已存在")return# 更新数据库self.cursor.execute("UPDATE saved_conditions SET condition_name=?, condition_expr=? WHERE condition_name=?",(new_name, new_expr, old_name))self.conn.commit()# 更新界面self.load_saved_conditions()self.condition_combo["values"] = [c[0] for c in self.saved_conditions]tree.item(selected[0], values=(new_name, new_expr))edit_win.destroy()messagebox.showinfo("成功", "条件已更新")except Exception as e:messagebox.showerror("错误", f"更新失败:{str(e)}")ttk.Button(edit_win, text="保存", command=save_changes).grid(row=2, column=1, pady=10)def delete_condition(self, tree):"""删除选中条件"""selected = tree.selection()if not selected:messagebox.showwarning("提示", "请先选择一个条件")returncondition_name = tree.item(selected[0], "values")[0]if messagebox.askyesno("确认删除", f"确定要删除条件 '{condition_name}' 吗?"):try:self.cursor.execute("DELETE FROM saved_conditions WHERE condition_name=?", (condition_name,))self.conn.commit()tree.delete(selected[0])self.load_saved_conditions()self.condition_combo["values"] = [c[0] for c in self.saved_conditions]messagebox.showinfo("成功", "条件已删除")except Exception as e:messagebox.showerror("错误", f"删除失败:{str(e)}")def save_condition(self):"""保存当前条件"""condition = self.condition_entry.get().strip()if not condition:messagebox.showwarning("输入错误", "当前没有可保存的条件")returnname = simpledialog.askstring("保存条件", "请输入条件名称:", parent=self.root)if not name:return# 检查重复self.cursor.execute("SELECT 1 FROM saved_conditions WHERE condition_name=?", (name,))if self.cursor.fetchone():messagebox.showerror("错误", "该名称已存在")returntry:save_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")self.cursor.execute("INSERT INTO saved_conditions VALUES (NULL, ?, ?, ?)",(name, condition, save_time))self.conn.commit()# 更新界面self.load_saved_conditions()self.condition_combo["values"] = [c[0] for c in self.saved_conditions]messagebox.showinfo("成功", "条件已保存")except Exception as e:messagebox.showerror("错误", f"保存失败:{str(e)}")def select_condition(self, event):"""选择已保存的条件"""selected_name = self.condition_combo.get()for name, expr in self.saved_conditions:if name == selected_name:self.condition_entry.delete(0, tk.END)self.condition_entry.insert(0, expr)breakdef clear_condition(self):"""清空筛选条件和结果"""self.condition_entry.delete(0, tk.END)self.result_tree.delete(*self.result_tree.get_children())self.filtered_df = pd.DataFrame()messagebox.showinfo("已清空", "筛选条件和结果已重置")def __del__(self):"""关闭数据库连接"""if hasattr(self, 'conn'):self.conn.close()if __name__ == "__main__":root = tk.Tk()app = ExcelViewerApp(root)root.geometry("1366x768")root.mainloop()

完毕!!感谢您的收看

----------★★跳转到历史博文集合★★----------

我的零基础Python教程,Python入门篇 进阶篇 视频教程 Py安装py项目 Python模块 Python爬虫 Json Xpath 正则表达式 Selenium Etree CssGui程序开发 Tkinter Pyqt5 列表元组字典数据可视化 matplotlib 词云图 Pyecharts 海龟画图 Pandas Bug处理 电脑小知识office自动化办公 编程工具 NumPy Pygame

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

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

相关文章

php8 枚举使用教程

简介 PHP 从 8.1 开始原生支持枚举&#xff08;enum&#xff09;&#xff0c;这是 PHP 向类型安全和现代语言特性迈进的重要一步。枚举可以定义一组有穷的、不可变的常量集合&#xff0c;常用于表示状态值、选项类型等。 基础语法 PHP 支持两种类型的枚举&#xff1a; 纯枚…

【Linux】Linux环境基础开发工具

前言 本篇博客我们来了解Linux环境下一些基础开发工具 &#x1f493; 个人主页&#xff1a;zkf& ⏩ 文章专栏&#xff1a;Linux 若有问题 评论区见&#x1f4dd; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 目录 1.Linux 软件包管理器 yum 2.Linux开发工具 2.1…

vue2开发者sass预处理注意

vue2开发者sass预处理注意 sass的预处理器&#xff0c;早年使用node-sass&#xff0c;也就是vue2最初默认的编译器。 sass官方推出了dart-sass来替代。 node-sass已经停维很久了。 vue3默认使用的是dart-sass。 Uniapp的官方文档截图 从 HBuilderX 4.56 &#xff0c;vue2 …

Spring MVC Controller 方法的返回类型有哪些?

Spring MVC Controller 方法的返回类型非常灵活&#xff0c;可以根据不同的需求返回多种类型的值。Spring MVC 会根据返回值的类型和相关的注解来决定如何处理响应。 以下是一些常见的 Controller 方法返回类型&#xff1a; String: 最常见的类型之一&#xff0c;用于返回逻辑…

[ctfshow web入门] web55

信息收集 这里把小写字母都过滤了&#xff0c;众所周知linux是大小写区分的&#xff0c;没有小写字母根本整不出来命令 if(isset($_GET[c])){$c$_GET[c];if(!preg_match("/\;|[a-z]|\|\%|\x09|\x26|\>|\</i", $c)){system($c);} }else{highlight_file(__FILE…

2021-11-11 C++泰勒sin(x)以2步进乘方除以阶乘加减第N项

缘由c书本题&#xff0c;求解了&#xff0c;求解-编程语言-CSDN问答 int n 10, d 3, z -1; double x 2.5, xx x;while (n){xx (乘方(x, d) / 阶乘(d)) * z;d 2, --n, z * -1;}std::cout << xx << std::endl;

湖仓一体化介绍

目录 一、湖仓一体化的定义与核心概念 二、湖仓一体化出现的背景 (一)数据仓库的局限性 (二

仓颉编程语言快速入门:从零构建全场景开发能力

在万物互联的智能时代,编程语言的演进始终与计算范式的革新紧密相连。华为推出的仓颉编程语言(Cangjie Programming Language)以“原生智能化、天生全场景”为核心理念,为开发者提供了一种兼顾高效开发与极致性能的新选择。本文将带你从零开始,快速掌握这门面向未来的语言…

AI教你学VUE——Deepseek版

一、基础阶段&#xff1a;打好Web开发基础 HTML/CSS基础 学习HTML标签语义化、CSS布局&#xff08;Flex/Grid&#xff09;、响应式设计&#xff08;媒体查询、REM/VW单位&#xff09;。资源推荐&#xff1a; MDN Web文档&#xff08;免费&#xff09;&#xff1a;HTML | CSS实战…

DeepSeek智能时空数据分析(八):NL2SQL绘制河流-轨迹缓冲区如何生成

序言&#xff1a;时空数据分析很有用&#xff0c;但是GIS/时空数据库技术门槛太高 时空数据分析在优化业务运营中至关重要&#xff0c;然而&#xff0c;三大挑战仍制约其发展&#xff1a;技术门槛高&#xff0c;需融合GIS理论、SQL开发与时空数据库等多领域知识&#xff1b;空…

推导部分和-图论+dfs+连通块

先研究一下&#xff0c;感觉有点像lca里的树上前缀和&#xff0c;不过树有多颗&#xff0c;用color区分一下 https://www.luogu.com.cn/problem/P8779 #include<bits/stdc.h> using namespace std; #define N 100011 typedef long long ll; typedef pair<int,int&g…

WPF MVVM入门系列教程(六、ViewModel案例演示)

&#x1f9ed; WPF MVVM入门系列教程 一、MVVM模式介绍二、依赖属性三、数据绑定四、ViewModel五、命令和用户输入六、ViewModel案例演示 在前面的文章中&#xff0c;介绍了ViewModel的基础概念 本文会使用一些实例来进行ViewModel的演示 一个基础的数据展示示例 假设我们要…

第2章 算法分析基础

2-1 算法的时间复杂度分析 2.1.1 输入规模与基本语句 输入规模&#xff1a;算法处理数据的规模&#xff0c;通常用 n 表示。 基本语句&#xff1a;执行次数与输入规模直接相关的关键操作。 例2.1 顺序查找 int SeqSearch(int A[], int n, int k) { for (int i 0; i < n…

QT高级(1)QTableView自定义委托集合,一个类实现若干委托

自定义委托集合 1同系列文章2 功能3 源码 1同系列文章 QT中级&#xff08;1&#xff09;QTableView自定义委托&#xff08;一&#xff09;实现QSpinBox、QDoubleSpinBox委托 QT中级&#xff08;2&#xff09;QTableView自定义委托&#xff08;二&#xff09;实现QProgressBar委…

webrtc 视频直播

webrtc 是一种开源的音视频通信技术&#xff0c;可以不借助中间媒介建立浏览器点对点&#xff08;peer-to-peer&#xff09;连接&#xff0c;实现音视频以及其他数据的传输。webrtc具有平台兼容性&#xff0c;低延迟与高实时的优点。今天主要记录一下webrtc的使用记录&#xff…

游戏引擎学习第261天:切换到静态帧数组

game_debug.cpp: 将ProfileGraph的尺寸初始化为相对较大的值 今天的讨论主要围绕性能分析器&#xff08;Profiler&#xff09;以及如何改进它的可用性展开。当前性能分析器已经能够正常工作&#xff0c;但我们希望通过一些改进&#xff0c;使其更易于使用&#xff0c;特别是在…

three.js设置物体轮廓发光和物体发光

设置物体轮廓发光 <script setup> import * as THREE from three; import { OrbitControls } from three/addons/controls/OrbitControls.js; // 导入后期合成 import { EffectComposer } from three/examples/jsm/postprocessing/EffectComposer.js; import { RenderPas…

homebrew安装配置Python(MAC版)

Mac系统自带python路径为: /System/Library/Frameworks/Python.framework/Versionbrew 安装 Python3 在终端输入以下命令&#xff1a; brew search python3 # 查看支持安装的版本 brew install python3就可以轻松easy安装python了&#xff0c;安装完成后提示 查看 pyth…

如何建设网站?网站建设简单步骤有哪些?

新手如何开展网站建设&#xff1f;网站建设包括哪些步骤&#xff1f; 在开展网站建设之前先清楚了解网站建设的流程和步骤&#xff1a;注册域名、租用虚拟主机/服务器、建站工具的选取、网站建设流程详细流程共计7步&#xff0c;分别是注册域名、域名实名制、服务器或虚拟主机、…

当K8S容器没有bash时高阶排查手段

遇到容器没有bash甚至没有sh的情况&#xff0c;就像被困在没有门窗的房间。但真正的K8S运维高手&#xff0c;即使面对这种情况也能游刃有余。 一、无Shell容器三大特征 极简主义&#xff1a;移除所有非必要组件&#xff08;如/bin/sh&#xff09;安全加固&#xff1a;减少攻击…