# coding: gb2312 import random from PyQt5.QtCore import QTimer from LSZXPagesLibrary.consensus import * from LSZXPagesLibrary.exercise_page_layout_define import ExercisePageLayoutDefine from LSZXPagesLibrary.pop_message_dialog import PopDialogMessage from LSZXPagesLibrary.pop_summary_dialog import PopSummaryDialog from PureBackend.global_execrise_backend import GEB STOP = "stop" HOME = "home" class ExercisePage(ExercisePageLayoutDefine): def __init__(self): super(ExercisePage, self).__init__() self.exercise_name = None self.eb = GEB().get_geb() # 注册返回界面的按钮 self.back_home_button.clicked.connect(self.back_home) # 注册结束考试按钮动作 self.stop_button.clicked.connect(self.stop) # 心率血氧测试 # self.bo_widget.set_data([random.randrange(0, 100) for i in range(10)]) # self.hr_widget.set_data([random.randrange(0, 120) for i in range(10)]) self.had_done = False # 心率血氧队列 self.max_size = 20 self.bo_min = 100 self.hr_max = 0 self.hr_list = [] self.bo_list = [] # 弹窗 # 确认弹窗 self.message_pop_windows = PopDialogMessage(self) self.message_pop_windows.connect(self.message_pop_commit) # 判断点击的按钮类型 self.click_type = None # 定时更新实时成绩面板 self.timer = QTimer() self.timer.timeout.connect(self._update) # 蛇形跑扣分项弹窗 self.pop_summary_dialog = PopSummaryDialog(self) self.pop_summary_dialog.connect(self.pop_summary_dialog_commit) # self.pop_summary_dialog.set_run_ahead('20秒') # self.pop_summary_dialog.set_runaround_count('10秒') def _update(self): data = self.eb.get_score() countdown = int(data['countdown']) hr = int(data['hr']) bo = int(data['bo']) had_done = data['had_done'] # 判断是否为蛇形跑 if 'preempt' in data: preempt_value = data['preempt'] preempt = f"{preempt_value:.2f}秒" count_value = data['count'] count = f"{count_value:.2f}秒" self.pop_summary_dialog.set_run_ahead(preempt) self.pop_summary_dialog.set_runaround_count(count) # 更新计时 minutes = int(countdown // 60) seconds = int(countdown % 60) # 计算分钟和秒 minutes_str = f"{minutes:02}" seconds_str = f"{seconds:02}" # 转换为带前导零的字符串 count_time_str = f"{minutes_str}:{seconds_str}" # 创建时分格式的字符串 self.set_counter(count_time_str) # 更新hrbo列表 if len(self.hr_list) >= self.max_size: self.hr_list.pop(0) if len(self.bo_list) >= self.max_size: self.bo_list.pop(0) if hr > self.hr_max: self.hr_max = hr if bo < self.bo_min: self.bo_min = bo self.bo_list.append(bo) self.bo_widget.set_data(self.bo_list, self.bo_min) self.hr_list.append(hr) self.hr_widget.set_data(self.hr_list, self.hr_max) # 判断是否结束 if self.data[EXERCISE_TYPE] == RUNAROUND and had_done: self.pause() self.click_type = STOP self.pop_summary_dialog.show() elif had_done: self.pause() self.click_type = STOP self.message_pop_windows.show("此操作将结束考试,并录入成绩, 是否继续?") def start(self): self.timer.start(500) # 每 500 毫秒获取一次帧 def pause(self): self.timer.stop() def resume(self): self.timer.start(500) def close(self): self.timer.stop() def refresh(self): exercise_name = EXERCISE_TYPE_TABLE[self.data[EXERCISE_TYPE]] person_mes = self.data[PERSON_MES] frame_generator = self.data[FRAME_GENERATOR] _id = person_mes[ID] _class = person_mes[CLASS] name = person_mes[NAME] self.set_title(_id, name, _class, exercise_name) self.video_displayer.set_frame_generator(frame_generator) self.video_displayer.start() # 启动成绩更新定时器 self.start() def set_title(self, _id, name, _class, exercise_name): self.id_box.setText(_id) self.name_box.setText(name) self.class_box.setText(_class) self.title_label.setText(exercise_name) # 设置计数值 def set_counter(self, count_text): self.count_box.setText(count_text) # 返回首页时弹窗提示 def back_home(self): self.click_type = HOME self.message_pop_windows.show("此操作将直接结束考试,且成绩作废, 是否继续?") # 结束考试时弹窗提示 def stop(self): self.click_type = STOP self.message_pop_windows.show("此操作将提前结束考试,且成绩作废, 是否继续?") # “此操作将直接结束考试,且成绩作废, 是否继续”弹窗点击了确定按钮事件 def message_pop_commit(self): self.eb.stop_exercise() # 判断点击按钮类型 if self.click_type == STOP: self.eb.update_score() # 关闭视频流 self.video_displayer.pause() data = { EXERCISE_TYPE: self.data[EXERCISE_TYPE], PERSON_LIST: self.eb.select_exercise_score(self.data[EXERCISE_TYPE]) } self.jump2(PICK_UP_PAGE, data) # 点击蛇形跑扣分项(包括抢跑、撞杆)弹窗的确认按钮响应事件 def pop_summary_dialog_commit(self): # 关闭视频流 self.video_displayer.pause() # 关闭成绩更新定时器 self.timer.stop() # 结束考试 self.reset_info() self.eb.stop_exercise() # 判断点击按钮类型 if self.click_type == STOP: self.eb.update_score() data = { EXERCISE_TYPE: self.data[EXERCISE_TYPE], PERSON_LIST: self.eb.select_exercise_score(self.data[EXERCISE_TYPE]) } self.jump2(PICK_UP_PAGE, data) # 重置参数 def reset_info(self): self.set_counter(str(0)) self.bo_list = [] self.bo_widget.set_data(self.bo_list, 100) self.hr_list = [] self.hr_widget.set_data(self.hr_list, 0)