181 lines
6.0 KiB
Python
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)
|