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.pswp.cn/bicheng/80104.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/80104.shtml
英文地址,請注明出處:http://en.pswp.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;減少攻擊…