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

news2024/11/20 9:22:20

前言

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

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 = False

def lottery_start(string):
    if running:
        return
    running = True
    lottery_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 = data
        self.running = False

        self.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:
            return
        self.running = True
        self.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 filedialog

def 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 showwarning
        showwarning("警告", 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 showwarning
            showwarning("警告", 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://www.coloradmin.cn/o/1469309.html

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

相关文章

消息中间件篇之RabbitMQ-消息不丢失

一、生产者确认机制 RabbitMQ提供了publisher confirm机制来避免消息发送到MQ过程中丢失。消息发送到MQ以后,会返回一个结果给发送者,表示消息是否处理成功。 当消息没有到交换机就失败了,就会返回publish-confirm。当消息没有到达MQ时&…

OT 安全解决方案:探索技术

IT 和 OT 安全的融合:更好的防御方法 OT 安全解决方案下一个时代: 为了应对不断升级的威胁形势,组织认识到迫切需要采用统一的信息技术 (IT) 和运营技术 (OT) 安全方法。IT 和 OT 安全的融合代表了一种范式转变,承认这些传统孤立领…

vue-nextTick(nextTick---入门到离职系列)

官方定义 在下次 DOM 更新循环结束之后执行延迟回调。在修改数据之后立即使用这个方法&#xff0c;获取更新后的 DOM。 个人理解 假设我们更改了某个 dom 元素内部的文本&#xff0c;而这时候我们想直接打印这个更改之后的文本是需要 dom 更新之后才会实现的。 小案例 <tem…

WordPress前端如何使用跟后台一样的Dashicons图标字体?

很多站长都喜欢在站点菜单或其他地方添加一些图标字体&#xff0c;常用的就是添加Font Awesome 图标和阿里巴巴矢量库图标iconfont。其实我们使用的 WordPress 本身就有一套管理员使用的官方图标字体 Dashicons&#xff0c;登录我们站点后台就能看到这些图标字体。那么有没有可…

进程间通信——管道错误总结

典型进程间通信方式&#xff1a;管道&#xff0c;共享内存&#xff0c;消息队列&#xff0c;信号量&#xff0c;网络通信&#xff0c;文件等多种方式 进程A读取B进程中的某个变量&#xff08;非共享内存&#xff09;&#xff0c;可行的方式有&#xff08;&#xff09;[多选] A…

电子器件系列63:肖特基二极管NSQ03A04\SS34C

以下是肖特基二极管_SS34C_规格书_SLKOR(萨科微),立创编号C880740 以下是肖特基二极管NSQ03A04的规格书&#xff1a; 稍微比较下参数&#xff0c;发现两者参数接近&#xff0c;ss34的几个参数还要略微好一些&#xff0c;可以用ss34来作替换。 在电源电路中的应用&#xff1a; …

SAM轻量化的终点竟然是RepViT + SAM

本文首发&#xff1a;AIWalker&#xff0c;欢迎关注~~ 殊途同归&#xff01;SAM轻量化的终点竟然是RepViT SAM&#xff0c;移动端速度可达38.7fps。 对于 2023 年的计算机视觉领域来说&#xff0c;「分割一切」&#xff08;Segment Anything Model&#xff09;是备受关注的一项…

Django学习记录04——靓号管理整合

1.靓号表 1.1 表结构 1.2 靓号表的构造 class PrettyNum(models.Model): 靓号表 mobile models.CharField(verbose_name"手机号", max_length11)# default 默认值# null true&#xff0c;blank true 允许为空price models.IntegerField(verbose_name"价…

Django模型基础(ORM、字段类型、字段参数、增删改查和分页)

模型基础&#xff1a; 字段类型&#xff1a; django根据属性的类型确定以下信息 当前选择的数据库⽀持字段的类型渲染管理表单时使⽤的默认html控件在管理站点最低限度的验证django会为表增加⾃动增⻓的主键列&#xff0c;每个模型只能有⼀个主键列&#xff0c;如果使⽤选项…

学习 LangChain 的 LCEL

学习 LangChain 的 LCEL 0. 引言1. 基本示例&#xff1a;提示模型输出解析器​1-1. Prompt​1-2. Model1-3. Output parser1-4. Entire Pipeline 0. 引言 LCEL(LangChain Expression Language) 可以轻松地从基本组件构建复杂的链&#xff0c;并支持开箱即用的功能&#xff0c;…

掌握BeautifulSoup4:爬虫解析器的基础与实战【第91篇—BeautifulSoup4】

掌握BeautifulSoup4&#xff1a;爬虫解析器的基础与实战 网络上的信息浩如烟海&#xff0c;而爬虫技术正是帮助我们从中获取有用信息的重要工具。在爬虫过程中&#xff0c;解析HTML页面是一个关键步骤&#xff0c;而BeautifulSoup4正是一款功能强大的解析器&#xff0c;能够轻…

mongoose httpserver浅析

文章目录 前言一、结构体及其功能二、函数MG_LOGmg_http_listenmg_mgr_poll question参考链接 前言 mongoose是一款基于C/C的网络库&#xff0c;可以实现TCP, UDP, HTTP, WebSocket, MQTT通讯。mongoose是的嵌入式网络程序更快、健壮&#xff0c;易于实现。 mongoose只有mong…

云尚办公-0.0.1

1. 核心技术 基础框架&#xff1a;SpringBoot数据缓存&#xff1a;Redis数据库&#xff1a;MySQL权限控制&#xff1a;SpringSecurity工作流引擎&#xff1a;Activiti前端技术&#xff1a;vue-admin-template Node.js Npm Vue ElementUI Axios微信公众号&#xff1a;公众…

适合新手博主站长使用的免费响应式WordPress博客主题JianYue

这款JianYue主题之所以命名为 JianYue&#xff0c;意思就是简单而不简约的。是根据Blogs主题优化而成&#xff0c;剔除了一些不必要的功能及排版&#xff0c;仅保留一种博客布局&#xff0c;让新手站长能够快速手上WordPress。可以说这款主题比较适合新手博主站长使用&#xff…

B树的介绍

R-B Tree 简介特性B树特性m阶B树的性质&#xff08;这些性质是B树规定的&#xff09; B树的搜索B树的添加B树的删除——非叶子结点 简介 R-B Tree又称为Red-Black Tree&#xff0c;红黑树。是一种特殊的二叉查找树&#xff0c;红黑树的每个节点上都有存储为表示结点的颜色&…

源代码管理——码云Gitee

目录 Git安装 Gitee配置SSH 源代码管理常规操作 1.idea配置git 2.常规操作 Git安装 安装Git是进行源代码管理的基本步骤之一。以下是在本地安装Git的通用步骤&#xff0c;适用于Windows系统&#xff1a; 下载Git安装程序: 访问Git官网的下载页面&#xff1a;Git官网下载地…

2024 CKS 题库 | 12、Sysdig falco

不等更新题库 CKS 题库 12、Sysdig & falco Task&#xff1a; 使用运行时检测工具来检测 Pod tomcat123 单个容器中频发生成和执行的异常进程。 有两种工具可供使用&#xff1a; sysdigfalco 注&#xff1a; 这些工具只预装在 cluster 的工作节点 node02 上&#xff0c;…

信号处理 | 短时傅里叶变换实战

短时傅里叶变换(STFT)原理 短时傅里叶变换&#xff08;Short-Time Fourier Transform, STFT&#xff09;是一种分析时变信号频率特性的方法。它通过将长时间的信号分割成较短的时间片段&#xff0c;然后对每个时间片段进行傅里叶变换&#xff0c;从而克服了传统傅里叶变换无法…

【Java程序设计】【C00300】基于Springboot的足球社区管理系统(有论文)

基于Springboot的足球社区管理系统&#xff08;有论文&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于Springboot的足球社区管理系统&#xff0c;本系统有管理员以及教练角色权限&#xff1b; 管理员设置的功能有&#xff1a;添加并管理各种类型…

代码随想录day33-动态规划的应用1

LeetCode62.不同路径 题目描述&#xff1a; 一个机器人位于一个 m x n 网格的左上角 &#xff08;起始点在下图中标记为 “Start” &#xff09;。 机器人每次只能向下或者向右移动一步。机器人试图达到网格的右下角&#xff08;在下图中标记为 “Finish” &#xff09;。 …