基于Python Tkinter实现简易点名器:源码与功能解析
本文介绍如何使用Python的Tkinter库开发一个简易的点名器程序。项目包含添加姓名、查看花名册、使用指南及随机抽取名字四大核心功能。通过读写txt文件持久化数据,并利用多线程实现名字滚动动画效果。文章提供了完整的代码示例及界面布局说明,适合Python初学者练习GUI编程与基础逻辑处理。
前言
回忆起小学课堂,老师为了点名提问曾特意购置点名器。如今闲暇之余,不妨用Python复刻一个类似的工具,重温那份趣味。
鉴于作者姓白,故将此项目命名为“小白点名器”。
该程序主要涵盖以下功能模块:姓名录入、花名册查询、使用指南查看以及随机抽取姓名(完整源码见文末)。
主界面设计
初始化主窗口,采用“w+”模式创建或打开test.txt文件以存储数据(若无需背景图片,相关代码可省略)。
#打开时预加载储存在test.txt文件中的花名册
namelist = []
with open("test.txt", "r") as f:
for line in f.readlines():
line = line.strip('\n')
namelist.append(line)
win = Tk()
win.title('小白点名器')
win.geometry('500x300')
#定义画布,添加背景图片
canvas = Canvas(win,width=500,height=300)
img_obj = PhotoImage(file=r"C:\Users\ge\Downloads\IMG_202206307919_png.png") #需输入照片路径
image = canvas.create_image(250,0,anchor = "n" , image = img_obj)
canvas.pack()
a = StringVar()
b = StringVar()
b.set('开始')
#定义可变文本信息
Label1 = Label(win, textvariable=a, font=('黑体', 100)).place(y= 60 , x=65)
#定义四个按钮
Button1 = Button(win, textvariable=b, font=('等线', 30), command = zhuanzhuan).place(y=210,x = 190)
Button2 = Button(win, text = '添加姓名', font=('等线', 20), command = addname).place(x= 50,y =0)
Button3 = Button(win, text = '查看', font=('等线', 20), command = chakan).place(x= 230,y =0)
Button4 = Button(win, text = '指南', font=('等线', 20), command = zhinan).place(x= 360,y =0)
win.mainloop()
添加姓名功能
构建姓名录入界面,每次提交后将姓名追加保存至test.txt。程序包含输入非空校验(通过提示框反馈)及花名册状态检查。
#定义添加姓名界面
def addname():
global Entry1
window = Tk()
window.title('姓名添加器')
window.geometry('400x200+500+200')
Label11 = Label(window, text = '请在下方输入你要添加的姓名', font=('黑体', 18), anchor='center').place(y=30, x=25)
Entry1 = Entry(window, font=('等线', 30), width=70)
Entry1.place(y=80, x=70, width=200, height=80)
Button3 = Button(window, text = '确认', font=('等线', 18), command = addname1).place(x= 300,y =80, height=80)
#每添加一次姓名就保存到test.txt文件中
def addname1():
global namelist #声明为全局变量实时更新
if len(Entry1.get()) == 0:
tkinter.messagebox.showinfo('提示', '姓名输入不能为空哦')
else:
if len(Entry1.get()) == 2:
zhongjian = list(Entry1.get())[::1]
zhongjian1 = zhongjian[0] + ' ' +zhongjian[1]
if len(namelist) == 0:
nam = zhongjian1
else:
nam = '\n' + zhongjian1
else:
if len(namelist) == 0:
nam = str(Entry1.get())
else:
nam = '\n' + str(Entry1.get())
with open("test.txt", "a") as f:
f.write(nam)
tip = '姓名:' + Entry1.get() + ' 添加成功'
tkinter.messagebox.showinfo('提示', tip)
print(nam)
namelist = []
with open("test.txt", "r") as f:
for line in f.readlines():
line = line.strip('\n')
namelist.append(line)
查看花名册功能
实现较为直观,利用Text组件直接渲染字典或列表中的存储信息即可。
def chakan():
window = Tk()
window.title('花名册查看')
window.geometry('350x200+500+200')
console = Text(window, font=('等线', 11))
console.place(y=20, x=35, width=280, height=170)
console.insert(1.0,namelist)
使用指南功能
逻辑同上,通过Text组件展示静态的帮助文本信息。
def zhinan():
window = Tk()
window.title('小白点名器使用指南')
window.geometry('350x230+500+200')
console = Text(window, font=('等线', 11))
console.place(y=20, x=35, width=280, height=190)
console.insert(1.0, ' 欢迎使用小白点名器1.0\n你可以在”添加姓名按钮上输入你要添加的名字\n你可以在”查看“按钮中查看花名册中所有的名字'
'\n你可以在此程序同级的名为”花名册.txt“的文件夹中直接批量添加、删减姓名(使用回车做分隔)\n--------------------------------\n'
'(指南之外)此程序在CSDN中已开源,欢迎访问我的博客:晋升阁\n需要合作的可加我微信:baijinge1137')
名字滚动抽取功能
核心逻辑涉及“开始”与“停止”状态切换。通过定义并启动独立线程来驱动名字快速轮播效果。
#判断状态
def zhuanzhuan():
if b.get() == '开始':
b.set('停止')
elif b.get() =="停止":
b.set('开始')
_thread.start_new_thread(xiancheng,()) #启用一个线程来转动姓名
#定义一个线程
def xiancheng():
global xuanzhong
while b.get()=='停止':
try:
xuanzhong = random.choice(namelist)
a.set(xuanzhong)
Label1.updata()#刷新数据
time.sleep(0.3)#0.3秒刷新一次
except:
continue
time.sleep(0.3)
a.set(xuanzhong)
完整代码展示
注意:本项目主界面默认包含背景图片,若不需要,可删除代码第90至94行。如需添加背景图,请确保图片路径配置正确。
import random
import time
from tkinter import *
import _thread
import tkinter.messagebox
def zhuanzhuan():
if b.get() == '开始':
b.set('停止')
elif b.get() =="停止":
b.set('开始')
_thread.start_new_thread(xiancheng,()) #启用一个线程来转动姓名
def xiancheng():
global xuanzhong
while b.get()=='停止':
try:
xuanzhong = random.choice(namelist)
a.set(xuanzhong)
Label1.updata()
time.sleep(0.3)
except:
continue
time.sleep(0.3)
a.set(xuanzhong)
def addname1():
global namelist #声明为全局变量实时更新
if len(Entry1.get()) == 0:
tkinter.messagebox.showinfo('提示', '姓名输入不能为空哦')
else:
if len(Entry1.get()) == 2:
zhongjian = list(Entry1.get())[::1]
zhongjian1 = zhongjian[0] + ' ' +zhongjian[1]
if len(namelist) == 0:
nam = zhongjian1
else:
nam = '\n' + zhongjian1
else:
if len(namelist) == 0:
nam = str(Entry1.get())
else:
nam = '\n' + str(Entry1.get())
with open("test.txt", "a") as f:
f.write(nam)
tip = '姓名:' + Entry1.get() + ' 添加成功'
tkinter.messagebox.showinfo('提示', tip)
print(nam)
namelist = []
with open("test.txt", "r") as f:
for line in f.readlines():
line = line.strip('\n')
namelist.append(line)
def chakan():
window = Tk()
window.title('花名册查看')
window.geometry('350x200+500+200')
console = Text(window, font=('等线', 11))
console.place(y=20, x=35, width=280, height=170)
console.insert(1.0,namelist)
def zhinan():
window = Tk()
window.title('小白点名器使用指南')
window.geometry('350x230+500+200')
console = Text(window, font=('等线', 11))
console.place(y=20, x=35, width=280, height=190)
console.insert(1.0, ' 欢迎使用小白点名器1.0\n你可以在”添加姓名按钮上输入你要添加的名字\n你可以在”查看“按钮中查看花名册中所有的名字'
'\n你可以在此程序同级的名为”花名册.txt“的文件夹中直接批量添加、删减姓名(使用回车做分隔)\n--------------------------------\n'
'(指南之外)此程序在CSDN中已开源,欢迎访问我的博客:晋升阁\n需要合作的可加我微信:baijinge1137')
def addname():
global Entry1
window = Tk()
window.title('姓名添加器')
window.geometry('400x200+500+200')
Label11 = Label(window, text = '请在下方输入你要添加的姓名', font=('黑体', 18), anchor='center').place(y=30, x=25)
Entry1 = Entry(window, font=('等线', 30), width=70)
Entry1.place(y=80, x=70, width=200, height=80)
Button3 = Button(window, text = '确认', font=('等线', 18), command = addname1).place(x= 300,y =80, height=80)
namelist = []
with open("test.txt", "r") as f:
for line in f.readlines():
line = line.strip('\n')
namelist.append(line)
win = Tk()
win.title('小白点名器')
win.geometry('500x300')
canvas = Canvas(win,width=500,height=300)
img_obj = PhotoImage(file=r"C:\Users\ge\Downloads\IMG_202206307919_png.png") #背景图片路径,若不需要添加将85—88行删掉即可
image = canvas.create_image(250,0,anchor = "n" , image = img_obj)
canvas.pack()
a = StringVar()
b = StringVar()
b.set('开始')
Label1 = Label(win, textvariable=a, font=('黑体', 100)).place(y= 60 , x=65)
Button1 = Button(win, textvariable=b, font=('等线', 30), command = zhuanzhuan).place(y=210,x = 190)
Button2 = Button(win, text = '添加姓名', font=('等线', 20), command = addname).place(x= 50,y =0)
Button3 = Button(win, text = '查看', font=('等线', 20), command = chakan).place(x= 230,y =0)
Button4 = Button(win, text = '指南', font=('等线', 20), command = zhinan).place(x= 360,y =0)
win.mainloop()以上为基于Python编写点名器的完整示例。如需获取更多Python相关资源,请持续关注本站其他技术文章。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









