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