LISHUZUOXUN_yangjiang/LSZXPagesLibrary/exercise_page.py

181 lines
6.0 KiB
Python

# 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)