基于tkinter的随机答题小工具,附带详细的注释
通过pyinstaller可以编译为可执行的exe
pip install pyinstaller
以下命令将main.py编译为单个执行的exe
pyinstaller -F -w -i lg.ico main.py
需要一个lg.ico图标exe放到同级目录(编译后的dist文件夹)
还需要一个 end.wav声音文件(倒计时结束声音)放到同级目录
声音播放基于playsound
pip install playsound
以下为main.py源码 做了详细的注释:
"""
随机答题
读取excel表格中的问题与解析随机抽取
实现了重复随机|去重随机
实现了自动倒计时|手动倒计时
第三方库
excel操作PfExcel基于openpyxl由作者二次封装(上个博客中有介绍)
声音播放基于playsound
"""
from time import sleep
from random import randint
from threading import Thread
from tkinter import (Tk,
Button,
Toplevel,
Menu,
IntVar,
filedialog,
messagebox,
DISABLED,
Frame,
StringVar,
NORMAL,
END,
GROOVE,
Entry)
from tkinter.scrolledtext import ScrolledText
from playsound import playsound
from PfExcel import ExcelWork
class Window(Tk):
def __init__(self):
super().__init__()
# 随机选项 0:不重复 | 1:重复
self.repetitive = IntVar()
self.repetitive.set(0)
# 倒计时选项 0:手动 | 1:自动
self.autoCountdown = IntVar()
self.autoCountdown.set(1)
# 倒计时运行状态
self.countdownNow = False
# 题库地址
self.filePath = ''
# 问题数据
self.askList = []
# 解析数据
self.keyList = []
# ui初始化
self.guiInit()
# 菜单栏
self.menu()
# 解析值
self.keyValue = ''
# 问题栏
self.askTextObj = self.askText()
# 倒计时数值
self.countdownNum = 15
# 倒计时按钮的标签值
self.countdownStr = StringVar()
# 设置倒计时按钮的标签值为倒计时
self.countdownStr.set('倒计时')
# 倒计时栏
self.countdown()
# 随机按钮的标签值
self.randomStart = StringVar()
# 设置随机随机按钮的标签值为开始
self.randomStart.set('开始')
# 控制栏
self.control()
def show(self):
"""
展示窗口
:return:
"""
self.mainloop()
def guiInit(self):
"""
主窗口初始化
:return:
"""
# 窗口宽高
width = 1200
height = 810
# 主屏幕宽高
mainWidth = self.winfo_screenwidth()
mainHeight = self.winfo_screenheight()
# 设置窗口大小与显示位置
self.geometry(f'{width}x{height}+{int((mainWidth - width) / 2)}+{int((mainHeight - height) / 2)}')
# 禁止窗口缩放
self.resizable(0, 0)
# 标题
self.title("随机答题")
# 图标
self.iconbitmap("lg.ico")
def menu(self):
"""
菜单栏
:return:
"""
menubar = Menu(self)
# 操作
operate = Menu(menubar, tearoff=0)
menubar.add_cascade(label="操作", menu=operate)
operate.add_command(label='选择题库', command=self.selectQb)
operate.add_command(label='倒计时设置', command=self.setCountdownNum)
operate.add_separator()
operate.add_radiobutton(label='重复随机', variable=self.repetitive, value=1)
operate.add_radiobutton(label='去重随机', variable=self.repetiti