【项目实战】帮美女老师做一个点名小程序(Python tkinter)

前言

博主有一个非常漂亮的老师朋友😍。最近,她急需一个能够实现随机点名的小程序,而博主正好擅长这方面的技术🤏。所以,今天博主决定为她制作一个专门用于点名的小程序💪。

q1.png

博主在美女老师面前吹完牛皮之后,当场打开 Python,引入 random 库,直接返回了一个随机整数值😏。

q2.png

美女老师一看,怒道:“你这做的什么东西”🤦‍♀️,裤裤的就给了博主两个大嘴巴子🖐️。

博主回去后痛定思痛,决定使用 Python 的 tkinter 库做一个 GUI 界面的点名程序,重新在美女老师面前找回面子🤡。

最终程序部分效果如下所示:

在这里插入图片描述

数据分析

当过老师的都知道,一个班级会有一本花名册,既然是点名小程序,那么肯定是需要学生的姓名的,为了防止班上有重名的同学,一般还会带上学号。

通常来说,花名册会使用 Excel 表格进行存储,因此这里引入 pandas 库进行读取,需要先安装 pandas 库:

pip install pandas
pip install openpyxl

接下来以下图的数据 demo.xlsx 为例进行分析与代码实现:

q3.png


1、先读取 Excel 中的数据:

import pandas as pd
pd.read_excel("demo.xlsx")

运行结果:

s1.png

2、将整体数据转换成迭代数据:

df = pd.read_excel("demo.xlsx")
for idx, row in df.iterrows():print(row)

运行结果:

s2.png

3、获取每一行的 “序号” 值与 “姓名” 值:

for idx, row in df.iterrows():print(f"{row['序号']} {row['姓名']}")

运行结果:

s3.png

这里可能会出现这么一个问题,传进来的 Excel 表中,没有 “序号” 或者 “姓名” 的列名,那么按照我们的逻辑,不符合我们模板要求的 Excel,我们不应该让他继续执行下去,所以这里使用 assert 进行判断:

columns = df.columns.values.tolist()
assert "序号" in columns, "需要一个名为 “序号” 的列表!"
assert "姓名" in columns, "需要一个名为 “姓名” 的列表!"

上述代码中的 df.columns.values.tolist() 是获取当前读取的 Excel 表的所有列表名称,这里的运行结果就是 ['序号', '班级', '姓名', '...']


整合上述代码

def deal_data(filepath):df = pd.read_excel(filepath)columns = df.columns.values.tolist()assert "序号" in columns, "需要一个名为 “序号” 的列表!"assert "姓名" in columns, "需要一个名为 “姓名” 的列表!"return [f"{row['序号']} {row['姓名']}" for idx, row in df.iterrows()]

构建界面

我们使用 tkinter 来构建可视化界面,引入 tkinter 库:

import tkinter as tk

接下来我们就开始构建 GUI 界面了。


1、初始化一个窗口;

window = tk.Tk()
window.mainloop()

运行结果:

g1.png

2、创建文字显示区域;

var = tk.StringVar(value="即 将 开 始")
show_label = tk.Label(window, textvariable=var)
show_label.pack()

在上述代码中,通过 tk.StringVar 方法创建一个字符串变量 var,并将其与标签对象 show_label 进行绑定,然后使用 pack() 方法将该标签放置在窗口中,以便显示在界面上。

运行结果:

g2.png

3、创建 “开始” 与 “结束” 按钮;

btn_start = tk.Button(window, text='开始')
btn_start.pack()btn_end = tk.Button(window, text='结束')
btn_end.pack()

运行结果:

g3.png

4、实现数据滚动功能;

data = [f"{row['序号']} {row['姓名']}" for idx, row in df.iterrows()]def lottery_roll(string: tk.StringVar):string.set(random.choice(data))window.after(50, lottery_roll, string)

在上述代码中,data 数据来自于读取 Excel 表格,lottery_roll 实现了数据滚动效果,其原理是通过 string.set(random.choice(data)) 这行代码从 data 中随机选择一个元素,并将其设置为 string 的值,然后使用 window.after() 方法在50毫秒之后继续调用 lottery_roll 函数,再次随机选择数据并更新界面。

最后将 lottery_roll 函数绑定到 “开始” 按钮上,

btn_start = tk.Button(window, text='开始', command=lambda: lottery_roll(var))

运行结果:

在这里插入图片描述

5、实现滚动停止功能;

前面我们已经实现了数据滚动,但我们还要让滚动停止,得出最后的结果,那么我们应该如何下手呢?

当然是从 window.after() 方法入手,因为它是实现数据滚动的关键,自然也是滚动停止的关键,我们可以设置一个标志位来判断是否还要继续执行 window.after() 方法,代码如下所示:

running = Falsedef lottery_start(string):if running:returnrunning = Truelottery_roll(string)def lottery_end():if running:running = False

同时,lottery_roll 也作出相应的修改,代码如下所示:

def lottery_roll(string: tk.StringVar):string.set(random.choice(data))if running:window.after(50, lottery_roll, string)

运行结果:

在这里插入图片描述

大家可能发现程序运行时,程序并不在屏幕中间,这对一些用户来说,可能是不好的使用体验,因此我们可以在初始化的时候进行设置,代码如下所示:

def center_window(root: tk.Tk, w, h):# 获取屏幕 宽、高ws = root.winfo_screenwidth()hs = root.winfo_screenheight()# 计算 x, y 位置x = (ws / 2) - (w / 2)y = (hs / 2) - (h / 2)root.geometry('%dx%d+%d+%d' % (w, h, x, y))

整合上述代码

def center_window(root: tk.Tk, w, h):# 获取屏幕 宽、高ws = root.winfo_screenwidth()hs = root.winfo_screenheight()# 计算 x, y 位置x = (ws / 2) - (w / 2)y = (hs / 2) - (h / 2)root.geometry('%dx%d+%d+%d' % (w, h, x, y))class CallWindow(tk.Tk):def __init__(self, data):super().__init__()self.data = dataself.running = Falseself.title("无奖问答")center_window(self, 405, 300)self.var = tk.StringVar(value="即 将 开 始")self.show_label = tk.Label(self,textvariable=self.var,)self.show_label.pack()self.btn_start = tk.Button(self,text='开始',command=lambda: self.lottery_start(self.var),)self.btn_start.pack()self.btn_end = tk.Button(self,text='结束',command=lambda: self.lottery_end(),)self.btn_end.pack()def lottery_roll(self, string):string.set(random.choice(self.data))if self.running:self.after(50, self.lottery_roll, string)def lottery_start(self, string):if self.running:returnself.running = Trueself.lottery_roll(string)def lottery_end(self):if self.running:self.running = False

优化进阶

在上述功能实现中,我们在代码里写死了文件路径,这对于程序的广泛适用性是很不友好的,因此,我们需要实现灵活获取文件并解析数据的功能。

1、初始化窗口;

window = tk.Tk()

2、创建文件路径输入框;

label_filepath = tk.Label(window, text="文件路径")
label_filepath.grid(row=0, column=0, padx=(10, 0), pady=10)
entry_filepath = tk.Entry(window)
entry_filepath.grid(row=0, column=1, columnspan=2, padx=(0, 10), ipadx=60)

运行结果:

j1.png

3、创建 “上传文件” 和 “解析数据” 按钮;

btn_upload_file = tk.Button(window, text="上传文件")
btn_upload_file.grid(row=2, column=1, pady=10, ipadx=30)
btn_parse_data = tk.Button(window, text="解析数据")
btn_parse_data.grid(row=2, column=2, ipadx=30)

运行结果:

j2.png

4、实现文件上传功能;

from tkinter import filedialogdef upload_file(entry: tk.Entry):filepath = filedialog.askopenfilename(title="请选择一个文件", filetypes=[("Excel", ".xls .xlsx")])entry.delete(0, tk.END)entry.insert(0, filepath)

在上述代码中,filedialog.askopenfilename() 方法弹出一个文件选择对话框供用户选择文件,并且通过 filetypes 指定了可以选择的文件类型为 Excel 文件(.xls 或 .xlsx 文件)。

运行结果:

j3.png

5、实现数据解析功能;

读取 Excel 的功能实现参照前面讲过的 deal_data() 方法,然后在数据成功解析之后,销毁当前界面,跳转至点名界面。

同时,还需要对解析过程中的异常进行捕获,如果出现异常,则提示用户相关信息。

def parse_data(root, entry_filepath):try:data = deal_data(entry_filepath.get())root.destroy()CallWindow(data)except Exception as e:from tkinter.messagebox import showwarningshowwarning("警告", f"解析数据失败!\n{e}")

运行结果:

j4.png


整合上述代码

class UploadWindow(tk.Tk):def __init__(self):super().__init__()self.title("上传")center_window(self, 350, 100)self.label_filepath = tk.Label(self, text="文件路径")self.label_filepath.grid(row=0, column=0, padx=(10, 0), pady=10)self.entry_filepath = tk.Entry(self)self.entry_filepath.grid(row=0, column=1, columnspan=2, padx=(0, 10), ipadx=60)self.btn_upload_file = tk.Button(self, text="上传文件", command=self.upload_file)self.btn_upload_file.grid(row=2, column=1, pady=10, ipadx=30)self.btn_parse_data = tk.Button(self, text="解析数据", command=self.parse_data)self.btn_parse_data.grid(row=2, column=2, ipadx=30)def upload_file(self):filepath = filedialog.askopenfilename(title="请选择一个文件", filetypes=[("Excel", ".xls .xlsx")])self.entry_filepath.delete(0, tk.END)self.entry_filepath.insert(0, filepath)def parse_data(self):try:data = deal_data(self.entry_filepath.get())self.destroy()CallWindow(data)except Exception as e:from tkinter.messagebox import showwarningshowwarning("警告", f"解析数据失败!\n{e}")

后记

在本文中,我们一起学习了如何利用 Python 中的 tkinter 模块构建一个简单的点名小程序。通过数据分析、构建界面和优化进阶这三个部分,我们逐步完成了这个项目。从中我们不仅掌握了 Python GUI 编程的基础知识,还了解了如何优化程序以提高用户体验。

以上就是 帮美女老师做一个点名小程序(Python tkinter) 的所有内容了,希望本篇博文对大家有所帮助!欢迎大家持续关注我的博客,一起分享学习和成长的乐趣!✨

如果你对Python感兴趣,想要学习python,这里给大家分享一份Python全套学习资料,都是我自己学习时整理的,希望可以帮到你,一起加油!

😝有需要的小伙伴,可以V扫描下方二维码免费领取🆓

1️⃣零基础入门

① 学习路线

对于从来没有接触过Python的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
在这里插入图片描述

② 路线对应学习视频

还有很多适合0基础入门的学习视频,有了这些视频,轻轻松松上手Python~
在这里插入图片描述

③练习题

每节视频课后,都有对应的练习题哦,可以检验学习成果哈哈!
在这里插入图片描述

2️⃣国内外Python书籍、文档

① 文档和书籍资料

在这里插入图片描述

3️⃣Python工具包+项目源码合集

①Python工具包

学习Python常用的开发软件都在这里了!每个都有详细的安装教程,保证你可以安装成功哦!
在这里插入图片描述

②Python实战案例

光学理论是没用的,要学会跟着一起敲代码,动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。100+实战案例源码等你来拿!
在这里插入图片描述

③Python小游戏源码

如果觉得上面的实战案例有点枯燥,可以试试自己用Python编写小游戏,让你的学习过程中增添一点趣味!
在这里插入图片描述

4️⃣Python面试题

我们学会了Python之后,有了技能就可以出去找工作啦!下面这些面试题是都来自阿里、腾讯、字节等一线互联网大厂,并且有阿里大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。
在这里插入图片描述
在这里插入图片描述

上述所有资料 ⚡️ ,朋友们如果有需要的,可以扫描下方👇👇👇二维码免费领取🆓

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2807979.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Unity Shader ASE基础效果思路与代码(三):Shader混合模式、深度渐变的扩散扫描、软粒子

Unity Shader ASE基础效果思路与代码(三):Shader混合模式、深度渐变的扩散扫描、软粒子 文章目录 Unity Shader ASE基础效果思路与代码(三):Shader混合模式、深度渐变的扩散扫描、软粒子Unity Shader的混合模式深度渐变的扩散扫描效果展示:代…

Mysql运维篇(五) 部署MHA--主机环境配置

一路走来,所有遇到的人,帮助过我的、伤害过我的都是朋友,没有一个是敌人。如有侵权,请留言,我及时删除! 大佬博文 https://www.cnblogs.com/gomysql/p/3675429.html MySQL 高可用(MHA&#x…

技术场景面试题

1.项目中遇到的比较棘手的问题,如何解决的。 第一个方向是设计模式在项目中的应用,遵循一系列的开发原则,设计模式都是前人总结出来的经验,对我们的开发有指导意义。 之前没有用设计模式,所有的登录都糅合在一个业务…

c++的类型转换方法

一、静态类型转换(static_cast) 静态类型的转换主要用于基本类型之间的转换,比如int类型转换为double类型。但是static_cast也可以支持上下行的转换(存在继承关系之间的转换) 基本类型之间的转换举例 上下行转换的举…

【无标题】欢迎使用Markdown编辑器

这里写自定义目录标题 欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants 创建一个自定义列表如何创建一个…

【Python笔记-设计模式】MVC模式

一、说明 它将应用程序分为三个核心部分:模型(Model)、视图(View)和控制器(Controller)。每个部分都有不同的责任,协同工作以实现用户界面和应用程序逻辑的分离。 模型&#xff08…

完美解决ubuntu+windows双系统下时间不正确问题

在同一台电脑上安装ubuntuwindows双系统时,会出现某个系统的时间不正确的问题,而由于windows同步时间实在是太慢了,如果不去解决,windows上的时间大概率一直都是不对的。 原因分析 windows采用LocalTime机制设置时间&#xff0c…

职场经验:Python自动化生成漂亮的测试报告【干货】

运用Python的Unittest、数据驱动测试(DDT)、Excel、Jinja2和HTML技术,构建一个能够自动生成精美可视化测试报告的自动化测试框架 思路流程 封装读取数据,让所有数据都能够再excel中填写,不再填写任何一行逻辑代码 通…

LeetCode二叉搜索树的最近公共祖先

题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p、q,最近公共祖先表示为一个结点 x,满足 x 是 p、q 的祖先且 x 的深度尽可能大(一个节点也…

【JavaEE】_ajax构造HTTP请求

目录 1. ajax简述 2. ajax构造HTTP请求 2.1 jquery库的引入 2.2 ajax构造HTTP请求格式 3. ajax构造GET请求实例 4. ajax构造POST请求实例 本专栏关于form表单构造HTTP请求一文中已经提到:form表单构造法只支持GET和POST,且会触发页面跳转。 原文详…

vue3+js 实现记住密码功能

常见的几种实现方式 1 基于spring security 的remember me 功能 ​​​​​​​ localStorage 除非主动清除localStorage 里的信息 ,不然永远存在,关闭浏览器之后下次启动仍然存在 存放数据大小一般为5M 不与服务器进行交互通信 cookies 可以…

装修避坑干货|阳台洗衣柜洗衣机一体柜设计。福州中宅装饰,福州装修

装修的时候常常会在洗衣柜中嵌入洗衣机,其实阳台柜的安装并不像看起来的那么简单,下面给大家说说几个注意事项‼️ 01.水电位置 在安装阳台柜之前,务必确认水电管道的位置。确保阳台柜不会阻碍水电管道的使用,以免造成不必要的麻…

辉辉数码:目前电视盒子哪个最好?目前性能最好的电视盒子

大家好,我是辉辉,上期测评发布后我收到了很多粉丝的反馈希望我这期能分享电视盒子推荐,看看目前电视盒子哪个最好。我购入了市面上最热门的十几款电视盒子对比配置、系统后整理了五款目前性能最好的电视盒子推荐给大家。 品牌型号&#xff1…

C++多继承之菱形继承原理及解决方法

目录 1.单继承和多继承 2.菱形继承 3.虚继承解决菱形继承 3.1使用方法 3.2虚继承原理 4.继承和组合 1.单继承和多继承 一个子类只有一个父类称为单继承 一个子类有多个父类称为多继承 2.菱形继承 菱形继承是多继承的一种复杂的情况 这里会出现一个问题,Assi…

Python中回调函数的理解与应用

前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站零基础入门的AI学习网站~。 目录 前言 回调函数的概念 回调函数的基本用法 回调函数的实现方式 1 使用函数 2 使用类方法 3 使用类实…

洛谷P5723 质数口袋 题解

#题外话&#xff08;第39篇题解&#xff09;&#xff08;本题为普及-难度&#xff09; #先看题目 题目链接https://www.luogu.com.cn/problem/P5723 #思路&#xff08;看代码吧&#xff09; #代码 #include <bits/stdc.h> using namespace std; bool p(int p_i){for(i…

快速搭建keepalived+nginx

1.工作原理 keepalived是以VRRP协议为实现基础的,VRRP全称Virtual Router Redundancy Protocol,即虚拟路由冗余协议。 虚拟路由冗余协议,可以认为是实现路由器高可用的协议,即将N台提供相同功能的路由器组成一个路由器组,这个组里面有一个master和多个backup,master上面…

数据脱敏(七)脱敏算法-洗牌算法

脱敏算法篇使用阿里云数据脱敏算法为模板,使用算子平台快速搭建流程来展示数据 "洗牌脱敏"是一种数据处理技术&#xff0c;主要用于保护个人隐私和数据安全。它通过随机打乱数据集中的记录顺序&#xff0c;使得基于行或列的攻击变得困难&#xff0c;从而防止数据泄露…

经典问题之区间分组

给定 N 个闭区间 [ai,bi]&#xff0c;请你将这些区间分成若干组&#xff0c;使得每组内部的区间两两之间&#xff08;包括端点&#xff09;没有交集&#xff0c;并使得组数尽可能小。 输出最小组数。 输入格式 第一行包含整数 N&#xff0c;表示区间数。 接下来 N 行&#…

【Python笔记-设计模式】代理模式

一、说明 代理模式是一种结构型设计模式&#xff0c;提供对象的替代品或其占位符。代理控制着对于原对象的访问&#xff0c;并允许在将请求提交给对象前后进行一些处理。 (一) 解决问题 控制对对象的访问&#xff0c;或在访问对象前增加额外的功能或控制访问 (二) 使用场景…