import PySimpleGUI as sg import openpyxl import xlrd import random def TakeRoll(): book = xlrd.open_workbook('sample.xlsx') sheet = book.sheet_by_index(0) book = openpyxl.load_workbook(filename='sample.xlsx') ins_sheet = book.active if sheet.ncols == 2: ins_sheet['C1'] = 'Scredit' idx = random.randint(2, sheet.nrows) stu = str(ins_sheet.cell(row=idx, column=1).value) + ins_sheet.cell(row=idx, column=2).value i = 2 while i <= sheet.nrows: ins_sheet.cell(row=i, column=3).value = 0 i += 1 book.save(filename='sample.xlsx') return stu, idx else: #学生表中含有已创建的SCredit列 max = 0 credit = ins_sheet['C'] #将SCredit列存入redit数组 i = 1 while i <= sheet.nrows-1: credit[i].value *= 2 #将所有积分值整数化(所有非整数积分值小数部分均为0.5) i += 1 i = 1 while i <= sheet.nrows-1: if credit[i].value > max: max = credit[i].value i += 1 max += 1 #求出最大积分值并加1 slct = [] i = 1 while i <= sheet.nrows-1: credit[i].value = max - credit[i].value #倒转积分值,将最大的积分值置为1,其余积分依次增大 r = 1 while r <= int(credit[i].value): slct.append(i) r += 1 #第i个学生倒转后的积分值即为slct数组中对应第i个学生的元素个数,和该生被选中的概率呈负相关 i += 1 idx = random.randint(0, len(slct)-1) stu = str(ins_sheet.cell(row=slct[idx]+1, column=1).value) + ins_sheet.cell(row=slct[idx]+1, column=2).value return stu, slct[idx]+1 def CreditUpdate(stu, isInc, point): book = openpyxl.load_workbook(filename='sample.xlsx') sheet = book.active if isInc == True: sheet.cell(row=stu, column=3).value += point else: sheet.cell(row=stu, column=3).value -= point book.save(filename='sample.xlsx') layoutA = [ [sg.Text('被点到的同学:'), sg.Text('', key = 'roll')], [sg.Button('点名')] ] layoutB1 = [ [sg.Button('是'), sg.Button('否')], ] layoutB2 = [ [sg.Button('是'), sg.Button('否')], ] layoutB3 = [ [sg.Button('是'), sg.Button('否')], ] layoutC = [ [sg.Button('回答问题'), sg.Button('请ta坐下')], ] List = [0.5, 1.0, 1.5, 2.0, 2.5, 3.0] layoutD = [ [sg.Drop(List, default_value = None, size = (30, 6), enable_events = True, key = 'point' )], [sg.Button('确认')] ] window = sg.Window('点名', layoutA) while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break if event == '点名': ret, rownum = TakeRoll() window['roll'].update(value=ret) window = sg.Window('该同学是否到位?', layoutB1) while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, '否'): break if event == '是': CreditUpdate(rownum, True, 1.0) window = sg.Window('接下来...', layoutC) while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, '请ta坐下'): break if event == '回答问题': window = sg.Window('该同学能否复述问题?', layoutB2) while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break if event == '是': CreditUpdate(rownum, True, 0.5) window = sg.Window('该同学答对问题了吗?', layoutB3) while True: event, values = window.read() if event in (sg.WINDOW_CLOSED, '否'): break if event == '是': window = sg.Window('给ta打分:', layoutD) while True: event, values = window.read() if event == sg.WINDOW_CLOSED: break if event == '确认': CreditUpdate(rownum, True, values['point']) break break break if event == '否': CreditUpdate(rownum, False, 1.0) break break break break window.close()