Python打發無聊時光:12.用PyQt實現簡易的心電起搏器界面

第一步:裝PyQt庫

pip install PyQt5

第二步:復制代碼

import sys
from PyQt5.QtWidgets import (QApplication, QMainWindow, QPushButton, QVBoxLayout,QWidget, QLabel, QProgressBar, QSlider, QLineEdit, QHBoxLayout)
from PyQt5.QtCore import QTimer, Qt
from matplotlib.backends.backend_qt5agg import FigureCanvasQTAgg as FigureCanvas
from matplotlib.figure import Figure# 心臟起搏器模擬器
class PacemakerSimulator(QMainWindow):def __init__(self, ecg_data):super().__init__()self.pulse_width = 200  # 起搏器脈寬的初始值(微秒)self.pulse_rate = 60  # 起搏器脈沖頻率的初始值(每分鐘脈沖數)self.battery_level = 100  # 起搏器的初始電池電量(百分比)self.ecg_data = ecg_data  # 添加實際ECG數據self.current_ecg_index = 0  # 初始化ECG數據索引self.ecg_plot_length = 50  # 設置ECG波形的長度self.initUI()# 使用QTimer模擬心電圖更新和起搏器脈沖self.ecg_timer = QTimer(self)self.ecg_timer.timeout.connect(self.update_ecg)self.pacing_timer = QTimer(self)self.pacing_timer.timeout.connect(self.pace)def initUI(self):# 設置窗口self.setWindowTitle('心臟起搏器模擬器')self.setGeometry(300, 300, 800, 600)# 創建布局和控件layout = QVBoxLayout()# 患者信息patient_info_layout = QHBoxLayout()self.patient_name_label = QLabel('患者姓名:')self.patient_name_input = QLineEdit(self)self.patient_name_input.setText("John Doe")patient_info_layout.addWidget(self.patient_name_label)patient_info_layout.addWidget(self.patient_name_input)layout.addLayout(patient_info_layout)# 電池電量self.battery_label = QLabel('電池電量:')self.battery_progress = QProgressBar(self)self.battery_progress.setValue(self.battery_level)layout.addWidget(self.battery_label)layout.addWidget(self.battery_progress)# 心電圖self.ecg_figure = Figure()self.ecg_canvas = FigureCanvas(self.ecg_figure)self.ecg_plot = self.ecg_figure.add_subplot(111)self.ecg_plot.axis('off')  # 可以選擇是否顯示坐標軸layout.addWidget(self.ecg_canvas)# 脈沖頻率控制self.pulse_rate_label = QLabel(f'脈沖頻率: {self.pulse_rate} BPM')self.pulse_rate_slider = QSlider(Qt.Horizontal, self)self.pulse_rate_slider.setMinimum(30)self.pulse_rate_slider.setMaximum(120)self.pulse_rate_slider.setValue(self.pulse_rate)self.pulse_rate_slider.valueChanged.connect(self.change_rate)layout.addWidget(self.pulse_rate_label)layout.addWidget(self.pulse_rate_slider)# 起搏器控制按鈕self.start_button = QPushButton('啟動', self)self.stop_button = QPushButton('停止', self)self.stop_button.setEnabled(False)  # 初始時停止按鈕不可用layout.addWidget(self.start_button)layout.addWidget(self.stop_button)# 設置中心窗口central_widget = QWidget()central_widget.setLayout(layout)self.setCentralWidget(central_widget)# 連接按鈕的點擊事件self.start_button.clicked.connect(self.start_pacing)self.stop_button.clicked.connect(self.stop_pacing)def start_pacing(self):pulse_interval_ms = int(60000 / self.pulse_rate)  # 將結果轉換為整數self.pacing_timer.start(pulse_interval_ms)self.ecg_timer.start(100)  # 心電圖更新頻率為 100 msself.start_button.setEnabled(False)self.stop_button.setEnabled(True)def stop_pacing(self):self.pacing_timer.stop()self.ecg_timer.stop()self.start_button.setEnabled(True)self.stop_button.setEnabled(False)def pace(self):# 模擬脈沖發射self.battery_level -= 0.1self.battery_progress.setValue(int(self.battery_level))if self.battery_level <= 0:self.battery_level = 100  # 假設可以充電def change_rate(self, value):self.pulse_rate = valueself.pulse_rate_label.setText(f'脈沖頻率: {self.pulse_rate} BPM')if self.pacing_timer.isActive():pulse_interval_ms = 60000 / self.pulse_rateself.pacing_timer.start(pulse_interval_ms)  # 更新起搏器發射脈沖的頻率def update_ecg(self):# 更新心電圖數據并顯示if self.current_ecg_index + self.ecg_plot_length > len(self.ecg_data):self.current_ecg_index = 0  # 如果到達數據末尾,重新開始self.ecg_plot.clear()self.ecg_plot.plot(self.ecg_data[self.current_ecg_index:self.current_ecg_index+self.ecg_plot_length], '-r')self.ecg_plot.axis('off')  # 關閉坐標軸self.ecg_canvas.draw()self.current_ecg_index += 1def main():ecg_data = [1822, 1793, 1814, 1670, 1684, 1660, 1552, 1503, 1565, 1508, 1454, 1534, 1479, 1414, 1563, 1563, 1471, 1602,1584, 1522, 1589, 1564, 1454, 1485, 1568, 1461, 1424, 1527, 1488, 1437, 1631, 1554, 1456, 1565, 1552, 1439,1551, 1568, 1543, 1533, 1643, 1610, 1633, 1779, 1749, 1652, 1792, 1783, 2064, 2062, 2205, 2170, 2075, 2161,2087, 1959, 1990, 1991, 1938, 1926, 2018, 1946, 1921, 2001, 1872, 1715, 1847, 1816, 1693, 1765, 1744, 1672,1744, 1749, 1733, 1734, 1830, 1740, 1686, 1804, 1875, 2403, 3280, 4095, 3829, 2643, 1472, 1213, 1642, 1922,1872, 1808, 1857, 1814, 1746, 1882, 1829, 1783, 1935, 1911, 1874, 2064, 2085, 2042, 2139, 2193, 2147, 2191,2292, 2271, 2250, 2411, 2361, 2506, 2422, 2289, 2433, 2381, 2272, 2291, 2227, 2095, 2026, 2077, 2001, 1942,1986, 1899, 1819, 1919, 1851, 1718, 1860, 1806, 1806, 1929, 1919, 1851, 1872, 2000, 1921, 1914, 2005, 1952,1888, 2038, 1993, 1902, 2009, 2013, 1905, 1971, 1921, 1883, 1932, 2005, 1915, 1880, 2054, 2059, 2017, 2129,2112, 2095, 2197, 2130, 2006, 2082, 2007, 1947, 1984, 2064, 2000, 1951, 2030, 1962, 1945, 2066, 2021, 1907,2010, 1981, 1914, 1998, 2014, 1906, 1979, 2081, 2093, 2036, 2157, 2112, 2060, 2119, 2034, 1954, 2095, 2007,1890, 1922, 1952, 1885, 1970, 2069, 2034, 2013, 2043, 1968, 1973, 2346, 3045, 3261, 3824, 3619, 2992, 1808,1595, 1900, 2373, 2389, 2094, 2185, 2376, 2274, 2394, 2338, 2183, 2302, 2229, 2131, 2220, 2206, 2127, 2097,2126, 2112, 2147, 2269, 2195, 2199, 2352, 2312, 2206, 2312, 2301, 2224, 2307, 2295, 2206, 2213, 2188, 2066,1990, 2101, 1999, 1975, 2063, 2019, 1918, 2066, 2034, 1971, 2096, 2102, 2002, 2079, 2128, 2081, 2235, 2238,2177, 2278, 2224, 2142, 2268, 2260, 2180, 2249, 2253, 2207, 2227, 2249, 2158, 2116, 2185, 2080, 2020, 2119,2037, 1912, 1986, 1937, 1848, 1922, 1911, 1814, 1821, 1829, 1736, 1798, 1874, 1814, 1705, 1872, 1843, 1761,# 確保ECG數據足夠長,以覆蓋update_ecg中的繪制范圍]app = QApplication(sys.argv)ex = PacemakerSimulator(ecg_data)ex.show()sys.exit(app.exec_())if __name__ == '__main__':main()

中間那一段數據很長,是以前做項目時我室友的心電,可以適當刪除部分

第三步:運行結果

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/713803.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/713803.shtml
英文地址,請注明出處:http://en.pswp.cn/news/713803.shtml

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

相關文章

軟件分層(數據結構/軟件邏輯上分層+舉例),相連節點的概念+如何相連,為什么是層狀結構(軟件分層,網絡協議分層+梳理協議順序),協議分層(打電話例子)

目錄 軟件分層 介紹 舉例 類的繼承 虛擬文件系統 線程接口封裝 虛擬地址空間 總結 為什么是層狀的 軟件分層 網絡協議 原因 梳理協議順序 相連節點 協議分層 引入 示例 實際上 邏輯上 制定出協議 軟件分層 介紹 通過將軟件系統劃分為不同的層次,每一層都有…

uniApp 調整小程序 單個/全部界面橫屏展示效果

我們打開uni項目 小程序端運行 默認是豎著的一個效果 我們打開項目的 pages.json 給需要橫屏的界面 的 style 屬性 加上 "mp-weixin": {"pageOrientation": "landscape" }界面就橫屏了 如果是要所有界面都橫屏的話 就直接在pages.json 的 gl…

Ps:海綿工具

海綿工具 Sponge Tool可用于調整圖像中特定區域的飽和度&#xff0c;常用于增加或減少顏色的飽和度。 快捷鍵&#xff1a;O 在特別的灰度圖像上&#xff0c;則可用于調整對比度&#xff0c;這可以開發出更多的創意技巧。 ◆ ◆ ◆ 常用操作方法與技巧 1、海綿工具主要用于調整…

源碼解析篇 | YOLOv8官方源碼項目目錄結構解析

前言&#xff1a;Hello大家好&#xff0c;我是小哥談。YOLOv8是一種目標檢測算法&#xff0c;它是YOLO&#xff08;You Only Look Once&#xff09;系列算法的第8個版本。YOLOv8相比于之前的版本&#xff0c;在檢測精度和速度上都有所提升&#xff0c;它在各種場景下都表現出色…

Git源碼管理

參考視頻&#xff1a;16-git的日志以及版本管理_嗶哩嗶哩_bilibili 參考博客&#xff1a;Git && Docker 學習筆記-CSDN博客 目錄 簡介 個人操作初始化 初始化git目錄 查看生成的git目錄文件 配置git工作目錄的用戶信息 查看工作區的狀態&#xff0c;生成文件的…

【JS】生成N位隨機數

作用 用于郵箱驗證碼 碼 ramNum.js /*** 生成N位隨機數字* param {Number} l 默認&#xff1a;6&#xff0c;默認生成6位隨機數字* returns 返回N位隨機數字*/ const ramNum (l 6) > {let num for (let i 0; i < l; i) {const n Math.random()const str String(n…

C++面試干貨---帶你梳理常考的面試題(一)

顧得泉&#xff1a;個人主頁 個人專欄&#xff1a;《Linux操作系統》 《C從入門到精通》 《LeedCode刷題》 鍵盤敲爛&#xff0c;年薪百萬&#xff01; 1.C和C的區別 1.語法和特性&#xff1a;C是一種過程式編程語言&#xff0c;而C是一種面向對象編程語言。C在C的基礎上增加…

Java智慧云HIS醫院信息化系統源碼 更具靈活性、擴展性

目錄 什么是云HIS 趨勢與轉變 HIS上云后有哪些好處 解決方案 云HIS組成 1、門診掛號 2、住院管理 3、電子病歷 4、藥物管理 5、統計報表 6、綜合維護 7、運營運維 什么是云HIS 云HIS是一種基于云計算技術的醫院信息管理系統。云HIS可以幫助醫院管理各類醫院信息&a…

CIE-Alevel-Physics分類真題下載(更新中)

鏈接真題歸類年份https://www.savemyexams.com/https://gceguide.com/papershttps://pastpapers.papacambridge.com/https://rocketrevise.comhttps://www.exam-mate.com/markhint.inhttps://xtremepape.rs/threads/as-and-a-level-physics-topical-pastpapers-upto-2015-with-…

Java Linux基本命令面試題

Java Linux基本命令面試題 前言1、查看文件內容有哪些命令可以使用&#xff1f;2、終端是哪個文件夾下的哪個文件&#xff1f;黑洞文件是哪個文件夾下的哪個命令&#xff1f;3、用什么命令對一個文件的內容進行統計&#xff1f;(行號、單詞數、字節數)4、怎么使一個命令在后臺運…

每日OJ題_分治歸并②_力扣LCR 170. 交易逆序對的總數

目錄 力扣LCR 170. 交易逆序對的總數 解析代碼1 解析代碼2 力扣LCR 170. 交易逆序對的總數 LCR 170. 交易逆序對的總數 難度 困難 在股票交易中&#xff0c;如果前一天的股價高于后一天的股價&#xff0c;則可以認為存在一個「交易逆序對」。請設計一個程序&#xff0c;輸…

Linux系統中安裝redis+redis后臺啟動+常見相關配置

1、下載Redis Redis官網&#xff1a;https://redis.io/ 歷史版本&#xff1a; http://download.redis.io/releases 2、連接Linux&#xff08;或者VMwear&#xff09; 我們安裝的是linux版本的redis 打開xftp我們需要先將我們的Redis上傳到服務器上 解壓到這里 解壓的指令 …

創建型模式之建造者模式

一、概述 1、建造者模式&#xff1a;將一個復雜對象的構建和它的表示分離&#xff0c;使得同樣的構建過程可以創建不同的表示 2、將客戶端與包含多個部件的復雜對象的創建過程分離&#xff0c;客戶端無須知道復雜對象的內部組成部分與裝配方式&#xff0c;只需要知道所需建造…

Spring MVC源碼中設計模式——適配器模式

適配器模式介紹 適配器模式&#xff08;Adapter Pattern&#xff09;是作為兩個不兼容的接口之間的橋梁。這種類型的設計模式屬于結構型模式&#xff0c;它結合了兩個獨立接口的功能。 應用場景&#xff1a; 1、系統需要使用現有的類&#xff0c;而此類的接口不符合系統的需要…

[c++] 繼承和多態整理一

1 private 和 protected 繼承&#xff0c;子類指針不能賦值給父類指針 如下代碼&#xff0c;有一個基類 Base&#xff0c;Derived1&#xff0c;Derived2&#xff0c;Derived3 3 個子類繼承了基類 Base&#xff0c;分別是 private 繼承&#xff0c;protected 繼承&#xff0c;p…

基于springboot+vue的紡織品企業財務管理系統

博主主頁&#xff1a;貓頭鷹源碼 博主簡介&#xff1a;Java領域優質創作者、CSDN博客專家、阿里云專家博主、公司架構師、全網粉絲5萬、專注Java技術領域和畢業設計項目實戰&#xff0c;歡迎高校老師\講師\同行交流合作 ?主要內容&#xff1a;畢業設計(Javaweb項目|小程序|Pyt…

Socket網絡編程(五)——TCP數據發送與接收并行

目錄 主要實現需求TCP 服務端收發并行重構啟動main方法重構重構分離收發消息的操作重構接收消息的操作重構發送消息TCPServer調用發送消息的邏輯監聽客戶端鏈接邏輯重構Socket、流的退出與關閉 TCP 客戶端收發并行重構客戶端 main函數重構客戶端接收消息重構客戶端發送消息重構…

前端封裝通用下載方法及下載后端返回的文件流

目錄 1.下載方法封裝 2.將后端返回的文件流轉換為文件 3.總結 1.下載方法封裝 ①說明 前端的請求大概分為三種類型 普通請求&#xff1a;常用的get&#xff0c;post&#xff0c;put&#xff0c;delete等請求 上傳請求&#xff1a;使用post請求&#xff0c;發送formdata對…

Zookeeper學習1:概述、安裝、應用場景、集群配置

文章目錄 概述安裝LinuxWindows 配置參數集群參考配置文件配置步驟流程啟動 概述 Zookeeper&#xff1a; 為分布式框架組件提供協調服務的中間件 【類似&#xff1a;文件系統通知機制】 負責存儲上下層應用關系的數據以及接收觀察者注冊監聽&#xff0c;一旦觀察查關心的數據發…

git操作基本指令

1.查看用戶名 git config user.name 2.查看密碼 git config user.password 3.查看郵箱 git config user.email 4.修改用戶名 git config --global user.name "xxx(新用戶名)" 5.修改密碼 git config --global user.password "xxx(新密碼)" 6.修改…