#教程读取excel文档https://blog.csdn.net/sinat_28576553/article/details/81275650
#教程oenpyxl读取excel文档https://www.cnblogs.com/BlueSkyyj/p/7571787.html
#pip install -i https://pypi.tuna.tsinghua.edu.cn/simple openpyxl #安装openpyxl,CMD需要以管理员身份运行
#教程tkinter使用https://blog.csdn.net/ahilll/article/details/81531587
import tkinter as tk #tkinter是python自带的图形开发库
import openpyxl #导入openpyxl库,本库可以修改excel的单元格内容。
import random
window = tk.Tk() #新建一个窗口
window.title("抽签") #窗口显示的名称
window.geometry('500x300') #窗口的分大小
displayword = tk.Label(window,text ='班级抽签程序',
bg = 'green', font = ('Arial',12),
width = 30,height = 2) #设置将要显示文本内容'班级抽签程序',
displayword.pack() #将文本显示在窗口中(由系统自动设置位置)
displayword1 = tk.Label(window,text ='班级选项:',
bg = 'green', font = ('Arial',12),
width = 30,height = 2)
displayword1.pack()
inputword = tk.Entry(window,show = None, font = ('Arial',14)) #设置一个单行输入框,输入选择的班级
inputword.pack()
displayword2 = tk.Label(window,text ='抽中次数上限:',
bg = 'green', font = ('Arial',12),
width = 30,height = 2) #设置将要显示文本内容'抽中次数上限:'
displayword2.pack()
inputword2 = tk.Entry(window,show = None, font = ('Arial',14)) #设置一个单行输入框,输入设定的选择次数上限
inputword2.pack()
displayword3 = tk.Label(window,text = "抽签结果",
bg = 'green', font = ('Arial',12),
width = 30,height = 2)#设置将要显示文本内容"抽签结果"
displayword3.pack()
print("1") #通过设置print函数,可以检测程序运行到哪段代码了。
workbook = openpyxl.load_workbook("名单.xlsx") #读取excel文"名单.xlsx"
#worksheet = workbook.worksheets[1] #通过工作簿顺序读取0为第一张表
sheetnames =str(workbook.sheetnames) #获取所有的工作簿名称,默认存储形式是list,数据类型需要修改为str
displayword1["text"] = '班级选项:'+ sheetnames #将displayword1显示内容修改为'班级选项:'+str(sheetnames)
print("2")
#在def定义函数之前,需要新建变量,函数内部新建的变量是局部变量,函数外面是全局变量(global).
sheetname =""
#cols = 0
#col = 0
rows = 0
row = 0
cv = ""#单元格的值
number = ""
runtimes = 0
name = ""
ID = ""
#定义函数,点击按钮以后触发的程序。
def click():
sheetname = inputword.get() #获取输入框内工作簿名称
worksheet = workbook[sheetname] #通过工作簿名称读取
#cols = worksheet.max_column #获取最大的列数
rows = worksheet.max_row #获取最大的行数
row = random.randint(2,rows) #获取随机一个行数
#col = random.randint(2,cols) #获取随机一个列数
cv = worksheet.cell(1,1).value #获取单元格第1行,第1列的值
number = worksheet.cell(row,3).value #获取第随机行,第3列单元格的值
numbers = int(inputword2.get()) #获取输入框内设定的上限,并转换为int型
#通过循环次数控制程序结果,缺点是可能漏掉,概率非常低,可以通过调整次数降低概率。
runtimes = 0
while runtimes <=5000:
if number <= numbers:
name = worksheet.cell(row,1).value #获取第随机行,第1列单元格的值,学生姓名
ID = str(worksheet.cell(row,2).value) #获取第随机行,第2列单元格的值,学生学号,并转换数据类型是str
number =number + 1 #学生被抽中次数加1
worksheet.cell(row,3,number) #将单元格row行,3列的值修改为number
#print(cv,name)
displayword3["text"] = name+ID #将displayword3显示的内容设置为抽中学生的姓名和学号
displayword3.pack()
break #跳出循环
else:
runtimes = runtimes + 1 #运行次数加1
row = random.randint(2,rows) #获取随机一个行数
#col = random.randint(2,cols) #获取随机一个列数
number = worksheet.cell(row,3).value #获取第随机行,第3列单元格的值
if runtimes >5000: #如果运行5000次都没有找到符合条件的学生
displayword3["text"] = "没有符合条件的同学" #将displayword3显示的内容设置为"没有符合条件的同学"
workbook.save("名单.xlsx") #保存工作表
b1 = tk.Button(window, text = '确认', width = 10,
height = 2, command = click) #设置按钮的参数
b1.pack()
#wait = input() #避免双击.py文件直接运行时程序退出。编辑状态时,input函数会导致程序无法显示tk界面