Python項目源碼63:病歷管理系統1.0(tkinter+sqlite3+matplotlib)

1.病歷管理系統包含以下主要功能:

核心功能:病歷信息錄入(患者姓名、年齡、性別、診斷結果、主治醫生),自動記錄就診時間,病歷信息展示(使用Treeview表格),病歷信息查詢(按姓名搜索),數據sqlite3存儲。
主要組件:輸入表單:包含患者基本信息輸入字段,功能按鈕:添加、查詢、保存、加載、清空,病歷列表:以表格形式展示所有病歷記錄,雙擊支持:雙擊記錄可自動填充到輸入框。
數據庫存儲:使用SQLite3替代JSON文件存儲,自動創建數據庫表結構,使用參數化查詢防止SQL注入。

2.使用說明:運行程序后會生成medical_records.db文件用于存儲數據,輸入患者信息后點擊"添加病歷"按鈕保存,輸入姓名等條件進行高級搜索,雙擊表格記錄可將數據填充到輸入框。
在這里插入圖片描述
高級查詢
在這里插入圖片描述
數據可視化
在這里插入圖片描述

# -*- coding: utf-8 -*-
# @Author : 小紅牛
# 微信公眾號:WdPython
import tkinter as tk
from tkinter import ttk, messagebox
import sqlite3
from datetime import datetime
from matplotlib import rcParams
import matplotlib.pyplot as plt
from matplotlib.backends.backend_tkagg import FigureCanvasTkAggclass MedicalRecordSystem:def __init__(self, root):self.root = rootself.root.title("病歷管理系統1.0")self.root.geometry("1000x800")# 初始化數據庫self.conn = sqlite3.connect('medical_records.db')self.create_table()# 創建界面組件self.create_widgets()self.load_data()def create_table(self):cursor = self.conn.cursor()cursor.execute('''CREATE TABLE IF NOT EXISTS records (id INTEGER PRIMARY KEY AUTOINCREMENT,name TEXT NOT NULL,age INTEGER,gender TEXT,diagnosis TEXT,doctor TEXT,date TEXT)''')self.conn.commit()def create_widgets(self):# 輸入區域input_frame = ttk.LabelFrame(self.root, text="病歷信息輸入")input_frame.pack(pady=10, padx=10, fill="x")labels = ["患者姓名:", "年齡:", "性別:", "診斷結果:", "主治醫生:"]self.entries = {}for i, text in enumerate(labels):label = ttk.Label(input_frame, text=text)label.grid(row=i, column=0, padx=5, pady=5, sticky="e")entry = ttk.Entry(input_frame, width=40)entry.grid(row=i, column=1, padx=5, pady=5, sticky="w")self.entries[text.strip(":")] = entry# 按鈕區域btn_frame = ttk.Frame(self.root)btn_frame.pack(pady=10)buttons = [("添加病歷", self.add_record),("修改病歷", self.update_record),("刪除病歷", self.delete_record),("高級搜索", self.advanced_search),("數據可視化", self.show_statistics),("清空輸入", self.clear_entries)]for i, (text, command) in enumerate(buttons):btn = ttk.Button(btn_frame, text=text, command=command)btn.grid(row=0, column=i, padx=5)# 病歷列表list_frame = ttk.LabelFrame(self.root, text="病歷列表")list_frame.pack(pady=10, padx=10, fill="both", expand=True)columns = ("id", "name", "age", "gender", "diagnosis", "doctor", "date")self.tree = ttk.Treeview(list_frame, columns=columns, show="headings")headings = [("id", "ID"),("name", "患者姓名"),("age", "年齡"),("gender", "性別"),("diagnosis", "診斷結果"),("doctor", "主治醫生"),("date", "就診日期")]for col_id, col_text in headings:self.tree.heading(col_id, text=col_text)self.tree.column(col_id, width=100, anchor="center")vsb = ttk.Scrollbar(list_frame, orient="vertical", command=self.tree.yview)hsb = ttk.Scrollbar(list_frame, orient="horizontal", command=self.tree.xview)self.tree.configure(yscrollcommand=vsb.set, xscrollcommand=hsb.set)self.tree.grid(row=0, column=0, sticky="nsew")vsb.grid(row=0, column=1, sticky="ns")hsb.grid(row=1, column=0, sticky="ew")list_frame.grid_rowconfigure(0, weight=1)list_frame.grid_columnconfigure(0, weight=1)self.tree.bind("<Double-1>", self.on_item_double_click)# 數據庫操作方法def execute_query(self, query, parameters=()):cursor = self.conn.cursor()try:cursor.execute(query, parameters)self.conn.commit()return cursorexcept Exception as e:self.conn.rollback()messagebox.showerror("數據庫錯誤", str(e))return None# 核心功能實現def add_record(self):record = (self.entries["患者姓名"].get(),self.entries["年齡"].get(),self.entries["性別"].get(),self.entries["診斷結果"].get(),self.entries["主治醫生"].get(),datetime.now().strftime("%Y-%m-%d %H:%M:%S"))if not record[0] or not record[3]:messagebox.showwarning("輸入錯誤", "患者姓名和診斷結果不能為空!")returntry:self.execute_query('''INSERT INTO records (name, age, gender, diagnosis, doctor, date)VALUES (?,?,?,?,?,?)''', record)self.load_data()self.clear_entries()messagebox.showinfo("成功", "病歷添加成功!")except Exception as e:messagebox.showerror("錯誤", f"添加失敗:{str(e)}")def update_record(self):selected = self.tree.selection()if not selected:messagebox.showwarning("警告", "請先選擇要修改的記錄")returnrecord_id = self.tree.item(selected[0], 'values')[0]new_data = (self.entries["患者姓名"].get(),self.entries["年齡"].get(),self.entries["性別"].get(),self.entries["診斷結果"].get(),self.entries["主治醫生"].get(),record_id)try:self.execute_query('''UPDATE records SETname=?, age=?, gender=?, diagnosis=?, doctor=?WHERE id=?''', new_data)self.load_data()messagebox.showinfo("成功", "病歷修改成功!")except Exception as e:messagebox.showerror("錯誤", f"修改失敗:{str(e)}")def delete_record(self):selected = self.tree.selection()if not selected:messagebox.showwarning("警告", "請先選擇要刪除的記錄")returnif messagebox.askyesno("確認", "確定要刪除這條記錄嗎?"):record_id = self.tree.item(selected[0], 'values')[0]try:self.execute_query('DELETE FROM records WHERE id=?', (record_id,))self.load_data()messagebox.showinfo("成功", "記錄已刪除")except Exception as e:messagebox.showerror("錯誤", f"刪除失敗:{str(e)}")def advanced_search(self):search_window = tk.Toplevel(self.root)search_window.title("高級搜索")criteria = [("患者姓名", "name"),("最小年齡", "min_age"),("最大年齡", "max_age"),("性別", "gender"),("診斷結果", "diagnosis"),("主治醫生", "doctor")]entries = {}for i, (label, key) in enumerate(criteria):ttk.Label(search_window, text=label + ":").grid(row=i, column=0, padx=5, pady=5)entry = ttk.Entry(search_window)entry.grid(row=i, column=1, padx=5, pady=5)entries[key] = entrydef perform_search():conditions = []params = []if entries['name'].get():conditions.append("name LIKE ?")params.append(f"%{entries['name'].get()}%")if entries['min_age'].get():conditions.append("age >= ?")params.append(int(entries['min_age'].get()))if entries['max_age'].get():conditions.append("age <= ?")params.append(int(entries['max_age'].get()))if entries['gender'].get():conditions.append("gender = ?")params.append(entries['gender'].get())if entries['diagnosis'].get():conditions.append("diagnosis LIKE ?")params.append(f"%{entries['diagnosis'].get()}%")if entries['doctor'].get():conditions.append("doctor LIKE ?")params.append(f"%{entries['doctor'].get()}%")query = "SELECT * FROM records"if conditions:query += " WHERE " + " AND ".join(conditions)cursor = self.execute_query(query, params)if cursor:results = cursor.fetchall()self.show_search_results(results)search_window.destroy()ttk.Button(search_window, text="搜索", command=perform_search).grid(row=len(criteria), columnspan=2)def show_search_results(self, results):result_window = tk.Toplevel(self.root)result_window.title("搜索結果")tree = ttk.Treeview(result_window, columns=("id", "name", "age", "gender", "diagnosis", "doctor", "date"),show="headings")headings = [("id", "ID"), ("name", "姓名"), ("age", "年齡"),("gender", "性別"), ("diagnosis", "診斷"),("doctor", "醫生"), ("date", "日期")]for col_id, col_text in headings:tree.heading(col_id, text=col_text)tree.column(col_id, width=100)for record in results:tree.insert("", "end", values=record)tree.pack(fill="both", expand=True)def show_statistics(self):# 設置全局中文字體(解決中文顯示問題)rcParams['font.sans-serif'] = ['SimHei']rcParams['axes.unicode_minus'] = False  # 解決負號顯示問題stat_window = tk.Toplevel(self.root)stat_window.title("數據統計")# 年齡分布統計age_ranges = ["0-18", "19-30", "31-45", "46-60", "61+"]queries = [("0-18歲", "age BETWEEN 0 AND 18"),("19-30歲", "age BETWEEN 19 AND 30"),("31-45歲", "age BETWEEN 31 AND 45"),("46-60歲", "age BETWEEN 46 AND 60"),("61歲及以上", "age >= 61")]age_data = {}for label, condition in queries:cursor = self.execute_query(f"SELECT COUNT(*) FROM records WHERE {condition}")age_data[label] = cursor.fetchone()[0]# 常見疾病統計cursor = self.execute_query("SELECT diagnosis, COUNT(*) FROM records GROUP BY diagnosis ORDER BY COUNT(*) DESC LIMIT 10")disease_data = cursor.fetchall()# 創建統計圖表fig = plt.Figure(figsize=(10, 6))# 年齡分布餅圖ax1 = fig.add_subplot(121)ax1.pie(age_data.values(), labels=age_data.keys(), autopct='%1.1f%%')ax1.set_title('年齡分布')# 常見疾病柱狀圖ax2 = fig.add_subplot(122)diagnoses = [item[0] for item in disease_data]counts = [item[1] for item in disease_data]ax2.barh(diagnoses, counts)ax2.set_title('常見疾病TOP10')ax2.invert_yaxis()canvas = FigureCanvasTkAgg(fig, master=stat_window)canvas.draw()canvas.get_tk_widget().pack(fill=tk.BOTH, expand=True)def load_data(self):cursor = self.execute_query("SELECT * FROM records ORDER BY date DESC")if cursor:self.tree.delete(*self.tree.get_children())for row in cursor.fetchall():self.tree.insert("", "end", values=row)def clear_entries(self):for entry in self.entries.values():entry.delete(0, "end")def on_item_double_click(self, event):selected = self.tree.selection()if selected:values = self.tree.item(selected[0], 'values')self.clear_entries()self.entries["患者姓名"].insert(0, values[1])self.entries["年齡"].insert(0, values[2])self.entries["性別"].insert(0, values[3])self.entries["診斷結果"].insert(0, values[4])self.entries["主治醫生"].insert(0, values[5])def __del__(self):self.conn.close()if __name__ == "__main__":root = tk.Tk()app = MedicalRecordSystem(root)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/79719.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/79719.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/79719.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

MCP底層協議完整通信過程

2025 年是智能體的元年, 也注定是智能體集中爆發的一年! 兩個互聯領域的重大挑戰: 第一、 Agent 與 Tools (工具)的交互 Agent 需要調用外部工具和 API

docker:制作鏡像+上傳鏡像+拉取鏡像

1.dockerfile制作鏡像 示例內容&#xff1a; 1.創建一個index.js的文件 console.log("hello world")2.在相同目錄下創建名為dockerfile的文件 FROM node:alpine COPY index.js /index.js CMD node /index.js3.構建鏡像 docker build -t minterra/hello-docker . …

docker制作python大模型鏡像(miniconda環境),工程改造記錄

**環境說明&#xff1a;**從系統鏡像開始打造python大模型鏡像&#xff0c;之前是人工手動裝的方式&#xff0c;并且模型和依賴在公網中&#xff0c;對于離線交付環境不太友好&#xff0c;所以打造的離線化交付版本 Dockerfile: FROM centos:7.9 ENV PYTHONIOENCODINGutf-8 E…

Rust中避免過度使用鎖導致性能問題的策略

一、引言 在 Rust 多線程編程中&#xff0c;鎖是實現線程同步的重要工具&#xff0c;它可以防止多個線程同時訪問和修改共享數據&#xff0c;從而避免數據競爭和不一致的問題。然而&#xff0c;過度使用鎖會帶來嚴重的性能問題&#xff0c;如鎖競爭導致的線程阻塞、上下文切換…

數據結構每日一題day15(鏈表)★★★★★

題目描述&#xff1a;將一個帶頭結點的單鏈表A分解為兩個帶頭結點的單鏈表A和 B,使得A表中含有原表中序號為奇數的元素,而B表中含有原表中序號為偶數的元素,且保持相對順不變&#xff0c;最后返回 B 表。 算法思想&#xff1a; 1.初始化&#xff1a; 創建新鏈表 B 的頭結點。…

【雜談】-探索 NVIDIA Dynamo 的高性能架構

探索 NVIDIA Dynamo 的高性能架構 文章目錄 探索 NVIDIA Dynamo 的高性能架構1. 大規模人工智能推理的日益嚴峻的挑戰2. 使用 NVIDIA Dynamo 優化 AI 推理3. 實際應用和行業影響4. 競爭優勢&#xff1a;Dynamo 與其他方案對比5. 總結 隨著人工智能&#xff08;AI&#xff09;技…

postgresql數據庫基本操作

1. 連接 PostgreSQL 數據庫 首先&#xff0c;使用 psql 命令行工具連接到數據庫。如果是本地連接&#xff0c;命令格式如下&#xff1a; psql -U postgres -d <數據庫名稱> -h <主機地址>其中&#xff1a; -U postgres&#xff1a;表示以 postgres 用戶身份登錄…

工業大模型:從設備診斷到工藝重構

引言 工業大模型正在引發制造業認知革命。據埃森哲研究,到2026年全球工業大模型市場規模將突破280億美元,其中工藝優化應用占比達42%。本文將系統解析工業大模型的"預訓練-領域適配-應用落地"技術路徑,并通過設備健康診斷與工藝參數生成的實踐案例,展示如何構建…

PyQt5基本介紹

PyQt5是基于Digia公司強大圖形框架Qt5的python接口&#xff0c;由一組python模塊構成。是一個用于創建桌面應用程序的Python庫&#xff0c;它是Qt圖形用戶界面工具包的Python綁定。 Qt是一個跨平臺的C庫&#xff0c;提供了一套豐富的工具和功能&#xff0c;用于開發圖形用戶界…

Tire 樹(字典樹/前綴樹)

一、定義與結構 用來快速存儲查找字符串集合的一種數據結構 將字符串按順序連接根節點上&#xff0c;并在字符串結束的地方打上標記并計數。 二、模板題 acwing 835 Trie 樹的字符串統計 題目&#xff1a; 維護一個字符串集合&#xff0c;支持兩種操作&#xff1a; I x 向…

【時時三省】(C語言基礎)怎樣定義和引用一維數組

山不在高&#xff0c;有仙則名。水不在深&#xff0c;有龍則靈。 ----CSDN 時時三省 一維數組是數組中最簡單的&#xff0c;它的元素只需要用數組名加一個下標&#xff0c;就能唯一地確定。如上面介紹的學生成績數組s就是一維數組。有的數組&#xff0c;其元素要指定兩個下標才…

編譯faiss

編譯faiss-1.10.0 首先確保自己cmake的版本&#xff1a; cmake --version 確保其版本至少為CMake 3.24.0 or higher is required。 其次安裝OpenBLAS&#xff1a; https://github.com/OpenMathLib/OpenBLAS 去這里去安轉Openblas內容&#xff0c;然后確保自己的CPU的指令集是存…

Linux 入門:操作系統進程詳解

目錄 一.馮諾依曼體系結構 一&#xff09;. 軟件運行前為什么要先加載&#xff1f;程序運行之前在哪里&#xff1f; 二&#xff09;.理解數據流動 二.操作系統OS(Operator System) 一&#xff09;.概念 二&#xff09;.設計OS的目的 三&#xff09;.如何理解操作系統…

word交叉引用圖片、表格——只引用編號的處理方法

交叉引用圖片/表格 在“引用”選項卡上的“題注”組中&#xff0c;單擊“插入題注”。勾選【從題注中排除標簽】。在文中插入題注。 【注 意】 這時候插入的題注只有編號項了。然后手動打上標簽【TABLE】&#xff0c;并在標簽和編號項之間加上【樣式分隔符&#xff0c;AltCt…

rails 8 CSS不起效問題解決

很久沒用rails了&#xff0c;最近打算重新復習一下。在配置好環境后&#xff0c;創建了項目&#xff0c;通過腳手架創建了數據庫表&#xff0c;和相關的文件。但我發現卻沒有生成相應的CSS文件&#xff0c;可能是rails8 取消了吧。于是自己手動創建了相應的css文件。但是刷新頁…

【nlohmann\json.hpp】‘_snprintf‘: is not a member of ‘std‘

這個問題時有發生但是為啥現在更新了vs2022 后,發生了這些報錯:2>(compiling source file ../worker/src/fargo/PacedVideoSenderGo.cpp) 2>D:\XTRANS\thunderbolt\ayame

數據結構--【二叉樹】

目錄 定義結構體&#xff1a; 初始化&#xff1a; 手動創建一個二叉樹&#xff1a; 前序遍歷&#xff1a; 中序遍歷&#xff1a; 后序遍歷 二叉樹節點個數&#xff1a; 葉子節點個數&#xff1a; 二叉樹第k層節點個數&#xff1a; 二叉樹的高度&#xff1a; 查找值為x…

深入解析Linux進程間通信(IPC):機制、應用與最佳實踐

引言 在多任務操作系統中&#xff0c;進程間通信&#xff08;Inter-Process Communication, IPC&#xff09;是協同工作的核心機制。Linux作為現代操作系統的典范&#xff0c;提供了8種主要IPC方式&#xff0c;從傳統的管道到面向網絡的套接字&#xff0c;每種方法都暗藏獨特的…

2025年“深圳杯”數學建模挑戰賽B題-LED顯示屏顏色轉換設計與校正

LED顯示屏顏色轉換設計與校正 小驢數模 問題的背景 走在晚風都市&#xff0c;或春日田野&#xff0c;我們都會看到一個色彩斑斕的世界。色彩是我們對世界一種重要感知。什么是色彩&#xff0c;或顏色&#xff1f;顏色是光作用于人眼引起的視覺感知現象&#xff0c;它與物體的…

Java學習手冊:Spring MVC 架構與實現

一、Spring MVC 概述 Spring MVC 是 Spring 框架的一個模塊&#xff0c;它提供了一套 Web 應用開發的解決方案&#xff0c;實現了 MVC&#xff08;Model-View-Controller&#xff09;設計模式。Spring MVC 提供了清晰的分離邏輯層、視圖層和控制器層的結構&#xff0c;便于開發…