用PySimpleGUI 做一个考试界面

写个考试小程序, 可以用作简单的选择题和判断题的题库考试

1.用户名和学号的登记;

2.开始考试;

3.交卷;

4.公布分数;

5.保存考试成绩和分数以及考试时间;


import PySimpleGUI as sg
import datetime
import pandas as pd

def create_exam_window():
    layout1 = [
        [sg.Text('XX模拟考试', font=('Helvetica', 40))],
        [sg.Text('', key='-TIME-', size=(20,1))],
        [sg.Text('考试总时间:3分钟')],
        [sg.Text('用户名'), sg.Input(key='-USERNAME-')],
        [sg.Text('学号'), sg.Input(key='-STUDENT_ID-')],
        [sg.Button('开始考试', key='-START_EXAM-')]
    ]
    return sg.Window('小学数学考试', layout1, finalize=True)

def create_question_window(user_info):
    layout2 = [
        [sg.Text('用户名:', font=('Helvetica', 16)), sg.Text(user_info['username'])],
        [sg.Text('学号:', font=('Helvetica', 16)), sg.Text(user_info['student_id'])],
        [sg.Text('', key='-TIMER-', size=(10,1), font=('Helvetica', 16), justification='right')],
        [sg.Text('题目1: 1 + 1 = ?', font=('Helvetica', 16))],
        [sg.Radio('2', "RADIO1", key='-Q1_OPTION1-'), sg.Radio('3', "RADIO1", key='-Q1_OPTION2-')],
        [sg.Submit('确定'), sg.Button('交卷', button_color=('white', 'green'))]
    ]
    return sg.Window('小学数学考试', layout2, finalize=True)

def create_result_window(score, total_questions):
    layout3 = [
        [sg.Text(f'恭喜你获得了{score}分!', font=('Helvetica', 20))],
        [sg.Text(f'得分: {score}/{total_questions} ({score/total_questions*100:.2f}%)')],
        [sg.Button('保存')]
    ]
    return sg.Window('考试结果', layout3, finalize=True)

def main():
    exam_window = create_exam_window()
    question_window = None
    result_window = None

    start_time = None
    current_question = 1
    total_questions = 4
    score = 0

    while True:
        window, event, values = sg.read_all_windows()
        if window == exam_window:
            if event == '-START_EXAM-':
                user_info = {
                    'username': values['-USERNAME-'],
                    'student_id': values['-STUDENT_ID-']
                }
                start_time = datetime.datetime.now()
                exam_window.hide()
                question_window = create_question_window(user_info)
        elif window == question_window:
            if event == '确定':
                if values['-Q1_OPTION1-']:
                    score += 1
                elif not values['-Q1_OPTION1-'] and not values['-Q1_OPTION2-']:
                    should_skip = sg.popup_yes_no('是否跳过该题?', title='提示')
                    if should_skip == 'Yes':
                        pass
                    else:
                        continue
                current_question += 1
                if current_question > total_questions:
                    question_window.hide()
                    result_window = create_result_window(score, total_questions)
                else:
                    window['-TIMER-'].update(f'{datetime.datetime.now() - start_time}')
                    window['-Q1_OPTION1-'].update(False)
                    window['-Q1_OPTION2-'].update(False)
        elif window == result_window:
            if event == '保存':
                df = pd.DataFrame({
                    '用户名': [values['-USERNAME-']],
                    '学号': [values['-STUDENT_ID-']],
                    '得分': [f'{score}/{total_questions}'],
                    '百分数': [f'{score/total_questions*100:.2f}%'],
                    '考试时间': [start_time]
                })
                df.to_excel('考试记录.xlsx', index=False)
                result_window.hide()
                break

        current_time = datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')
        exam_window['-TIME-'].update(current_time)

    window.close()

if __name__ == '__main__':
    main()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

dieter.ding

祝老板码来财

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值