使用Tkinter库设计实现的中小学校疫情防控入校人员登记检测系统

news2024/11/15 23:51:47
Tkinter简介

Tkinter是Python标准库中用于GUI图形用户界面开发的工具包,它是基于Tcl/Tk的封装,提供了大量预定义的控件,如按钮、文本框、标签等,非常适合快速原型开发和小型应用的构建。本文将通过一个具体的案例——“中小学校疫情防控入校人员登记检测系统”来详细介绍Tkinter的基本使用和一些高级功能。

系统设计目标

本系统旨在帮助中小学校有效管理疫情期间入校人员的健康状况,包括基本信息录入、健康状况检查、异常情况预警及历史访问记录查询等功能。系统采用Tkinter进行界面设计,实现直观的用户交互。

界面布局与控件使用
  1. 主窗口配置
    使用root.geometry()设置窗口尺寸和位置,确保窗口居中显示。通过root.title()设定窗口标题,root.resizable()防止用户调整窗口大小。

  2. 菜单栏设计
    通过tk.Menu创建菜单栏,使用add_cascade添加下拉菜单,如“校内人员”和“其余人员”,并为其添加子菜单项,如“学生”、“教师”和“校外人员”。每项菜单关联不同的函数,用于动态生成相关表单。

  3. 控件布局

    • 文本标签tk.Label用于显示字段名称。
    • 输入框tk.Entry用于收集用户输入。
    • 单选按钮tk.Radiobutton用于性别、消毒洗手、佩戴口罩和接触感染人员的选择。
    • 下拉框ttk.Combobox用于年级、部门、近期去过的地方和身体异常情况的选择。
  4. 功能实现

    • 条件判断函数data_judge检查体温、接触史、旅行史和健康状态,决定是否允许进入校园。
    • 数据保存函数save将访问者信息和检测结果写入文本文件。
    • 访问历史查询函数select从文件中检索并显示特定访问者的记录。
  5. 显示区域
    一个专用的框架display_frame用于显示访问历史,包含一个标签show_label用于更新显示内容。

效果图

由于这是一个文本格式的博客,无法直接显示图像,但是你可以运行上述代码在本地环境中查看效果。界面设计清晰,布局合理,用户可以直观地填写信息并进行操作。

完整代码
import tkinter as tk
from tkinter import messagebox as msb
from tkinter import ttk
import datetime
# ---------------------------父窗口设计------------------------------
# 初始化窗口
root = tk.Tk()
# 获取屏幕宽度、高度
Screen_width = root.winfo_screenwidth()
Screen_height = root.winfo_screenheight()
# 定义窗口的宽度、高度
Root_width = 900
Root_height = 600
# 定义窗口初始位置的坐标值
x = (Screen_width - Root_width) / 2
y = (Screen_height - Root_height) / 2
# 使窗口位于屏幕中央
root.geometry("%dx%d+%d+%d" % (Root_width, Root_height, x, y))
# 为窗口添加标题
root.title("中小学校疫情防控入校人员登记检测系统")
# 窗口大小设置为不可变
root.resizable(False, False)

# ---------------------------菜单栏设计------------------------------
def others():
    fr_others = tk.Frame(root, height=150, width=310, bd=3)
    fr_others.place(x=450, y=150)
    label8 = tk.Label(fr_others, text='访 校 事 由:', font=('宋体', '12'))
    label8.place(x=10, y=20)
    entry8 = tk.Entry(fr_others)
    entry8.place(x=120, y=20)
    label9 = tk.Label(fr_others, text='访问对象姓名:', font=('宋体', '12'))
    label9.place(x=10, y=80)
    entry9 = tk.Entry(fr_others)
    entry9.place(x=120, y=80)
    return 0

def student():
    # 创建年纪选择组件框
    fr_student = tk.Frame(root,height=150, width=310,bd=3)
    fr_student.place(x=450,y=150)
    grade = tk.StringVar()
    grade_combobox = ttk.Combobox(fr_student, textvariable=grade)
    grade_combobox['value'] = ('一年级', '二年级', '三年级', '四年级', '五年级','六年级',
                               '七年级', '八年级', '九年级', '高一级','高二级', '高三级')
    grade_combobox['state'] = 'readonly'
    grade_combobox.current(0)
    grade_combobox.bind('<>')
    grade_combobox.place(x=100, y=20)
    label_combobox = tk.Label(fr_student, text='年    级:', font=('宋体', '12'))
    label_combobox.place(x=10, y=20)
    label10 = tk.Label(fr_student, text='班    级:', font=('宋体', '12'))
    label10.place(x=10, y=80)
    entry10 = tk.Entry(fr_student)
    entry10.place(x=100, y=80)
    return 0

def teacher():
    # 创建教师职务组件框
    fr_teacher = tk.Frame(root, height=150, width=310, bd=3)
    fr_teacher.place(x=450, y=150)
    techer = tk.StringVar()
    techer_combobox = ttk.Combobox(fr_teacher, textvariable=teacher)
    techer_combobox['value'] = ('办公室', '教务处', '政教处', '后勤处', '财务处','校医室', '其他级组')
    techer_combobox['state'] = 'readonly'
    techer_combobox.current(0)
    techer_combobox.bind('<>')
    techer_combobox.place(x=120, y=20)
    labe_combobox = tk.Label(fr_teacher, text='所属部门:', font=('宋体', '12'))
    labe_combobox.place(x=10, y=20)
    return 0

# 创建一个菜单栏
menubar = tk.Menu(root)
# 定义一个校内人员和校外人员的空菜单单元
in_menu = tk.Menu(menubar, tearoff=0)  # tearoff意为下拉
out_menu = tk.Menu(menubar, tearoff=0)  # tearoff意为下拉
# 为菜单添加一级菜单标签
menubar.add_cascade(label='校内人员', menu=in_menu)
menubar.add_cascade(label='其余人员', menu=out_menu)
# 为“校内人员”添加二级菜单
in_menu.add_command(label='学生',command=student)
in_menu.add_command(label='教师',command=teacher)
root.config(menu=menubar)
# 为“其余人员”添加二级菜单
out_menu.add_command(label='校外人员',command=others)

# ---------------------------窗口控件设计------------------------------
label1 = tk.Label(root,text='姓    名:',font=('宋体','12'))
label1.place(x=30,y=30)
name = tk.StringVar()
entry1 = tk.Entry(root,textvariable=name)
entry1.place(x=130,y=30)

label2 = tk.Label(root,text='性    别:',font=('宋体','12'))
label2.place(x=30,y=80)
# 创建性别单选项
male = tk.StringVar()
def get_radiobut12_value():
    print(male.get())
radiobt1 = tk.Radiobutton(root,text='男',font=('宋体','12'),value="男",variable=male,command=get_radiobut12_value)
radiobt1.place(x=140,y=80)
radiobt2 = tk.Radiobutton(root,text='女',font=('宋体','12'),value="女",variable=male,command=get_radiobut12_value)
radiobt2.place(x=210,y=80)

label3 = tk.Label(root,text='联系方式:',font=('宋体','12'))
label3.place(x=30,y=130)
entry3 = tk.Entry()
entry3.place(x=130,y=130)

label4 = tk.Label(root,text='体    温:',font=('宋体','12'))
label4.place(x=30,y=180)
temp = tk.StringVar()
entry4 = tk.Entry(root,textvariable=temp)
entry4.place(x=130,y=180)
print(temp.get())

# 创建消毒洗手单选项
label5 = tk.Label(root,text='消毒洗手:',font=('宋体','12'))
label5.place(x=30,y=230)
xiaodu = tk.StringVar()
def get_radiobut34_value():
    print(xiaodu.get())
    if xiaodu.get() == '否':
        msb.showwarning(title="提示", message="禁止进入,请您立即在校门口设置的消毒站消毒洗手!")
radiobt3 = tk.Radiobutton(root,text='是',font=('宋体','12'),value="是",variable=xiaodu,command=get_radiobut34_value)
radiobt3.place(x=140,y=230)
radiobt4 = tk.Radiobutton(root,text='否',font=('宋体','12'),value="否",variable=xiaodu,command=get_radiobut34_value)
radiobt4.place(x=210,y=230)

# 创建佩戴口罩单选项
label6 = tk.Label(root,text='佩戴口罩:',font=('宋体','12'))
label6.place(x=30,y=280)
peidai = tk.StringVar()
def get_radiobut56_value():
    print(peidai.get())
    if peidai.get() == '否':
        msb.showwarning(title="提示", message="禁止进入,请在消毒站领取并佩戴口罩!")

radiobt5 = tk.Radiobutton(root,text='是',font=('宋体','12'),value="是",variable=peidai,command=get_radiobut56_value)
radiobt5.place(x=140,y=280)
radiobt6 = tk.Radiobutton(root,text='否',font=('宋体','12'),value="否",variable=peidai,command=get_radiobut56_value)
radiobt6.place(x=210,y=280)

# 创建接触感染人员单选项
label7 = tk.Label(root,text='接触感染人员:',font=('宋体','12'))
label7.place(x=30,y=330)
ganran = tk.StringVar()
def get_radiobut78_value():
    print(ganran.get())
radiobt7 = tk.Radiobutton(root,text='是',font=('宋体','12'),value="是",variable=ganran,command=get_radiobut78_value)
radiobt7.place(x=140,y=330)
radiobt8 = tk.Radiobutton(root,text='否',font=('宋体','12'),value="否",variable=ganran,command=get_radiobut78_value)
radiobt8.place(x=210,y=330)

#创建近期去过那里组件框
place = tk.StringVar()
place_combobox = ttk.Combobox(root,textvariable=place)
place_combobox['value'] = ('无','北京','新疆',"湖北","武汉","广西","国外")
place_combobox['state'] = 'readonly'
place_combobox.current(0)
place_combobox.bind('<>')
place_combobox.place(x=600,y=30)
label_combobox = tk.Label(root,text='近期去过哪里:',font=('宋体','12'))
label_combobox.place(x=450,y=30)

#创建身体异常组件框
body = tk.StringVar()
body_combobox = ttk.Combobox(root,textvariable=body)
body_combobox['value'] = ('正常','发热,乏力','干咳,咽痛','鼻塞,流涕','腹泻')
body_combobox['state'] = 'readonly'
body_combobox.current(0)
body_combobox.bind('<>')
body_combobox.place(x=600,y=100)
label_combobox = tk.Label(root,text='身体异常情况:',font=('宋体',12))
label_combobox.place(x=450,y=100)


# -------------------------------来访人员入校记录区-----------------------------------
display_frame = tk.Frame(root,height=240, width=900,relief=tk.GROOVE,bd=3)
display_frame.pack(side=tk.BOTTOM)
lab2 = tk.Label(display_frame,text='来访人员访问历史查询显示区',font=('黑体','12'))
display_frame.propagate(0)
lab2.pack()
show_label = tk.Label(display_frame,height=240, width=900,relief=tk.GROOVE,bd=5,bg='white')
show_label.pack(side=tk.TOP)

def data_judge():
    a = float(temp.get())
    b = ganran.get()
    c = place.get()
    d = body.get()
    if a >= 37.8 or b == "是" or c != "无" or d != "正常":
        msb.showwarning(title="提示", message="您的数据显示异常,禁止进入学校!")
    else:
        msb.showwarning(title="提示", message="您的数据显示正常,请进入学校,并及时保存数据!")
def save():
    now_time = datetime.datetime.now()
    a = entry1.get()
    b = entry3.get()
    c = float(temp.get())
    d = ganran.get()
    e = place.get()
    f = body.get()
    g = male.get()
    filename = 'information_record.txt'
    with open(filename, 'a') as f1:
        if c >= 37.8 or d == "是" or e != "无" or f != "正常":
            f1.write(a + "," + g + ",于" + str(now_time) + "时进行入校检测,检测结果异常,"+ "其联系方式是:" + b +"\n")
        else:
            f1.write(a + "," + g + ",于" + str(now_time) + "时进行入校检测,检测结果正常,"+ "其联系方式是:" + b +"\n")
    f1.close()

def select():
    name = entry1.get()
    filename = 'information_record.txt'
    with open(filename, 'r') as f2:
        lines = f2.readlines()
        print(lines)
        for line in lines[:len(lines)]:
            str1 = line.rstrip()
            list2 = str1.split(",")
            print(list2)
            if name == list2[0]:
                show_label["text"] = str1
                break
            else:
                show_label["text"] = "此人未有访问记录"



#创建查询,保存按钮
butten1 = tk.Button(root,text='查询',font=('黑体','12'),command=select)
butten1.place(x=300,y=25)
butten2 = tk.Button(root,text='保存信息',font=('黑体','12'),command=save)
butten2.place(x=600,y=300)
butten3 = tk.Button(root,text='条件检测',font=('黑体','12'),command=data_judge)
butten3.place(x=500,y=300)
root.mainloop()

效果图

在这里插入图片描述

结论

Tkinter提供了强大的工具集来构建功能丰富的桌面应用程序。通过本案例,我们不仅了解了Tkinter的基本使用,还学习了如何设计复杂界面,实现数据处理和文件操作。希望这篇教程能够帮助你掌握Tkinter,并鼓励你在自己的项目中尝试使用它。

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

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

相关文章

【java】力扣 合并k个升序链表

文章目录 题目链接题目描述思路代码 题目链接 23.合并k个升序链表 题目描述 给你一个链表数组&#xff0c;每个链表都已经按升序排列。 请你将所有链表合并到一个升序链表中&#xff0c;返回合并后的链表 思路 我在这个题里面用到了PriorityQueue(优先队列) 的知识 Prio…

鸿蒙语言基础类库:【@system.app (应用上下文)】

应用上下文 说明&#xff1a; 从API Version 7 开始&#xff0c;该接口不再维护&#xff0c;推荐使用新接口。本模块首批接口从API version 3开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。 导入模块 import app from system.app;app.getInfo …

MFC之对话框--重绘元文件

文章目录 实现示例展示需要绘制的窗口/位置控件位置更新下一次示例粗细滑动部分更新 重绘元文件&#xff08;窗口变化内容消失&#xff09;方法一&#xff1a;使用元文件方法二&#xff1a;兼容设备方法三&#xff1a;使用自定义类存储绘图数据除画笔外功能处理画笔功能处理 保…

【雷达原理】MIMO雷达技术

一、MIMO雷达原理 1.1 基本概念 多输入多输出(Multiple input multiple output&#xff0c;MIMO)雷达指该雷达具有多个发射天线和多个接收天线。 学术界对 MIMO 雷达的定义中&#xff0c;多输入是指同时发射多种雷达信号波形( 一般是多个天线同时发射不同的波形) &#xff0c;…

藏着不为人知的泪水

在娱乐圈的璀璨舞台上&#xff0c;每一个光芒四射的背后&#xff0c;藏着不为人知的汗水与泪水。提及#张艺凡 出道位#&#xff0c;这段历程&#xff0c;不仅仅是个人奋斗的见证&#xff0c;更是关于勇气、坚持与自我证明的壮丽篇章。曾几何时&#xff0c;网络的喧嚣声中&#x…

【信息系统项目管理师】高项常见知识点与公式

绩效域、合同、配置、变更、招投标、安全、立项论文考到的话大致业是按下面相关知识点开写 八大绩效域及其要点 团干部策划开公交 合同管理 合同的签订->合同的履行管理->合同的变更管理->合同的档案管理->合同的违约\索赔管理 配置管理 制定配置管理计划配置识…

欧几里得算法求解若干数的最小公倍数

公倍数 公倍数(common multiple)是指在两个或两个以上的自然数中&#xff0c;如果它们有相同的倍数&#xff0c;这些倍数就是它们的公倍数。公倍数中最小的数&#xff0c;就称为这些整数的最小公倍数&#xff08;lowest common multiple&#xff09; 求解方法 求多个数的最小公…

c++ new 与二级指针

new 与数组的简单用法&#xff0c;一个简单的例子&#xff1a; #include <stdio.h> #include <stdlib.h>#define MAX_ARRAY_NUM 10int main() {int *p new int[MAX_ARRAY_NUM];for(int i 0; i < MAX_ARRAY_NUM; i){p[i] i 10;}for(int i 0; i < MAX_AR…

MAVSDK动态库与静态库及mavsdk_server程序macOS平台编译与安装

1.克隆mavsdk: git clone https://github.com/mavlink/MAVSDK.git --recursive 2.编译静态库 cmake -Bbuild/default -H. -DCMAKE_BUILD_TYPE=Release -DBUILD_SHARED_LIBS=OFF 生成makefile 生成成功,开始编译 cmake --build build/default -j8 成功生成libmavsdk.a 开…

BUCK电源芯片,电气参数,极限参数,工作特性,引脚功能

概述 在应用DC-DC开关电源芯片时&#xff0c;通常需要关注以下参数&#xff0c;同步与非同步&#xff0c;输入电压&#xff0c;输入电流&#xff0c;输出电压&#xff0c;输出电流&#xff0c;输入输出电容的选择&#xff1b;mosfet选型&#xff0c;电感选型&#xff0c;功耗&a…

python作业三

1.使用requests模块获取这个json文件http://java-api.super-yx.com/html/hello.json 2.将获取到的json转为dict 3.将dict保存为hello.json文件 4.用io流写一个copy(src,dst)函数,复制hello.json到C:\hello.json import json import shutilimport requests #使用requests模块获…

RPC与服务的注册发现

文章目录 1. 什么是远程过程调用(RPC)?2. RPC的流程3. RPC实践4. RPC与REST的区别4.1 RPC与REST的相似之处4.2 RPC与REST的架构原则4.3 RPC与REST的主要区别 5. RPC与服务发现5.1 以zookeeper为服务注册中心5.2 以etcd为服务注册中心 6. 小结参考 1. 什么是远程过程调用(RPC)?…

MybatisPlus(MP)基础知识

MP BaseMapper 为了简化单表CRUD&#xff0c;MybatisPlus提供了一个基础的BaseMapper接口&#xff0c;其中已经实现了单表的CRUD&#xff0c;因此我们自定义的Mapper只要实现了这个BaseMapper&#xff0c;就无需自己实现单表CRUD了。 package com.itheima.mp.mapper;import …

基于javaScript的冒泡排序

目录 一.前言 二.设计思路和原理 三.源代码展示 四. 案例运行结果 一.前言 冒泡排序简而言之&#xff0c;就是一种算法&#xff0c;能够把一系列的数据按照一定的顺序进行排列显示&#xff08;从小到大或从大到小&#xff09;。例如能够将数组[5,4,3,2,1]中的元素按照从小到…

优选算法之双指针(上)

目录 双指针&#xff08;利用数组下标来充当指针&#xff09;&#xff1a; 一、移动零 1.题目链接&#xff1a;283.移动零 2.题目描述&#xff1a; 3.解法&#xff08;快排的思想&#xff1a;数组划分区间 - 数组分两块&#xff09; &#x1f334;算法思路&#xff1a; …

2024.7.14周报

目录 摘要 ABSTRACT 一、文献阅读 一、题目 二、摘要 三、文献解读 一、Introduction 二、KINN框架 三、主要结果 四、Conclusion 二、KAN 一、KAN与MLP区别 二、KAN网络解析 三、激活函数参数化&#xff08;B-splines&#xff09; 三、网络架构代码 摘要 本周…

Vue1-Vue核心

目录 Vue简介 官网 介绍与描述 Vue的特点 与其它 JS 框架的关联 Vue周边库 初识Vue Vue模板语法 数据绑定 el与data的两种写法 MVVM模型 数据代理 回顾Object.defineProperty方法 何为数据代理 Vue中的数据代理 数据代理图示 事件处理 事件的基本使用 事件修…

【Python 项目】类鸟群:仿真鸟群

类鸟群&#xff1a;仿真鸟群 仔细观察一群鸟或一群鱼&#xff0c;你会发现&#xff0c;虽然群体由个体生物组成&#xff0c;但该群体作为一个整体似乎有它自己的生命。鸟群中的鸟在移动、飞越和绕过障碍物时&#xff0c;彼此之间相互定位。受到打扰或惊吓时会破坏编队&#xf…

数据库管理-第218期 服务器内存(20240711)

数据库管理218期 2024-07-11 数据库管理-第218期 服务器内存&#xff08;20240711&#xff09;1 内存2 ECC内存3 原理3.1 多副本传输3.2 纠错码3.3 汉明码 总结 数据库管理-第218期 服务器内存&#xff08;20240711&#xff09; 作者&#xff1a;胖头鱼的鱼缸&#xff08;尹海文…

TCP三次握手四次挥手原理

学习视频&#xff1a;TCP三次握手四次挥手 TCP报文格式 源端口号和目的端口号&#xff1a;同IP数据报中的源IP与目的IP唯一确定一条TCP连接 序号seq&#xff08;4字节32位&#xff09;:用来标识TCP发端向TCP收端发送的数据字节流 确认序号&#xff08;4字节32位&#xff09;&a…