Files
Random-Picker/.history/点名器_20221107175513.pyw
2022-11-07 18:08:39 +08:00

189 lines
5.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import xlrd as excel
from tkinter import *
import tkinter.messagebox as msgbox
import random
import sys
import win32con, win32api
gui_size = "620x200"
gui = Tk()
gui.title("点名器")
gui.geometry(gui_size)
gui.resizable(0,0)
gui.configure(bg = "white")
class Student(object):
name = ""
subject = ""
id = ""
class_name = ""
def __init__(self,id,class_name,subject,name):
self.id = id
self.class_name = class_name
self.subject = subject
self.name = name
protection_override = False
up_percent = 30
down_persent = 40
filename = "names.xls"
configname = "config.data"
elim_rows = 1
percent_override = True
try:
excel_data = excel.open_workbook(filename)
table = excel_data.sheets()[0]
win32api.SetFileAttributes(filename,win32con.FILE_ATTRIBUTE_HIDDEN)
except FileNotFoundError:
msgbox.showerror('找不到数据库文件', '在相同目录下未能找到 names.xls 文件,请确认您的文件存在')
sys.exit()
try:
cols = table.ncols
rows = table.nrows
assert cols == 4
assert rows > 1
except AssertionError:
msgbox.showerror('数据库文件格式不正确', '数据库文件内行/列数不合法请确认数据库文件拥有超过1的行数和等于4的列数当前行数' + str(rows) + ' 当前列数:' + str(cols))
sys.exit()
elim_id = []
up_id = []
down_id = []
try:
with open(configname,'r') as file:
win32api.SetFileAttributes(configname,win32con.FILE_ATTRIBUTE_HIDDEN)
config = file.read().splitlines()
for unit in config:
temp = unit.split(",")
if temp[1] == '0':
elim_id.append(int(temp[0]))
elif temp[1] == '+':
up_id.append(int(temp[0]))
elif temp[1] == "-":
down_id.append(int(temp[0]))
else:
pass
except:
percent_override = False
up_percent = len(up_id) * 5 if len(up_id) <= 6 else 30
down_percent = len(down_id) * 8 if len(down_id) <= 5 else 40
students = []
classes = []
subjects = []
filter = []
last_choice = ""
# print("读取数据库成功:" + str(cols) + "列 " + str(rows) + "行")
for i in range(elim_rows,rows):
tmp_list = [str(table.cell_value(i,j)) for j in range(0,cols)]
if (int(float(tmp_list[0])) not in elim_id):
student = Student(tmp_list[0],tmp_list[1],tmp_list[2],tmp_list[3])
students.append(student)
cur_stu = []
cur_stu = students[:]
for student in students:
if student.class_name not in classes:
classes.append(student.class_name)
if student.subject not in subjects:
subjects.append(student.subject)
cur_name = StringVar()
def upd_name(name):
cur_name.set(name)
upd_name("")
listbox = Listbox(gui, selectmode = MULTIPLE, height = 5)
for tmp_class in classes:
listbox.insert("end",tmp_class)
def sel_class(flag = 1):
global filter, listbox, classes, cur_stu, students
filter.clear()
for selection in listbox.curselection():
# print(selection)
filter.append(classes[selection])
# print(filter)
if filter:
if flag:
msgbox.showinfo('班级选择已应用', '已应用当前班级选择', parent=gui)
cur_stu.clear()
for student in students:
if student.class_name in filter:
# print(student.name)
cur_stu.append(student)
else:
if flag:
msgbox.showwarning('班级选择已应用', '当前设置会选择所有班级的名单,这样对吗?', parent=gui)
filter = classes[:]
cur_stu = students[:]
def choose():
global last_choice, cur_stu
sel_class(0)
# 触发30%概率从up中挑选
if (random.randint(1,100) < up_percent and percent_override):
protection_override = True;
temp = []
for student in cur_stu:
if int(float(student.id)) in up_id:
temp.append(student)
cur_stu = temp[:]
elif (random.randint(1,100) < down_persent and percent_override):
protection_override = True;
temp = [];
for student in cur_stu:
if int(float(student.id)) not in down_id:
temp.append(student)
cur_stu = temp[:]
else:
protection_override = False
if not cur_stu:
protection_override = False
sel_class(0)
choice = random.choice(cur_stu)
# print(choice.name)
counter = 0;
while (last_choice == choice.name and (not protection_override)) or choice.id in elim_id:
choice = random.choice(cur_stu)
counter = counter + 1
if counter >= 100:
break
# print(choice.name)
upd_name(choice.name)
class_label.config(text = choice.class_name)
subject_label.config(text = choice.subject)
last_choice = choice.name
startrandom = Button(gui, text = "立刻摇人!", font = ("宋体", 17, "bold"), height = 2, fg = "red", command = choose, bg = "white")
setclass = Button(gui, text = "应用班级选用", font = ("宋体", 17), height = 2, command = sel_class, bg = "white")
name_label = Label(gui, textvariable = cur_name, font = ("宋体", 30, "bold"), width = 20, bg = "white", fg = "blue")
class_label = Label(gui, text = "", font = ("宋体", 15), width = 20, bg = "white")
subject_label = Label(gui, text = "", font = ("宋体", 15), width = 20, bg = "white")
class_label.grid(row = 2, column = 1, sticky = N+S+E+W)
subject_label.grid(row = 2, column = 2, sticky = N+S+E+W)
name_label.grid(row = 1, column = 1, sticky = N+S)
listbox.grid(row = 1, column = 2, sticky = N+S)
startrandom.grid(row = 3, column = 1, sticky = N+S+E+W)
setclass.grid(row = 3, column = 2, sticky = N+S+E+W)
gui.mainloop()