Python GUI项目实战(一)登录窗体的设计与实现

前言

前面我们学习了Python GUI 图像化界面Tkinter的基础知识,为了检测我们的学习成果,学以致用。我们从今天开始做一个综合Tkinter案例--基于Tkinter的学生信息管理系统,一方面熟悉Tkinter项目的开发,另一方面可以把我们前面的《Python基础学习笔记》的知识综合在一起。

基础功能介绍

说明:

由于我们尚未学习数据库的内容,所以我们这个应用程序开发的过程中,暂时通过文件的读写方式来存储数据。等到后面我们介绍了关系数据库的知识,整个项目对接到数据库中也是很方便的。

感兴趣的小伙伴们,可以直接私信我免费获取项目使用到的素材和源码,我们一起手把手搭建这个项目!

1.登录功能

本项目支持用户名和密码的验证登录,支持密码输入三次自动锁定等功能;

2. 主窗体

  • 显示当前登录用户名、登录时间

  • 支持添加学生信息、修改学生信息、删除学生信息、更改当前账号密码

  • 支持多条件查询学生信息

这里我们查询所有学号以31901开头的学生,在这些学生中再次筛选手机号码中有138号段的学生。

3. 添加并查看学生信息

点击添加按钮可以添加学生信息,保存后,可查看明细信息。同时也支持修改与删除。

4. 更改当前账户的密码

支持更改当前账户密码,同时具备密码校验功能。


好啦,从现在开始正式进入项目的开发吧,今天我们要做的内容是登录界面框架GUI的设计与功能实现!

一、 登录界面的实现

from tkinter import *from tkinter.ttk import *import osclass LoginWindow(Tk):    '''    创建登录窗体的GUI界面已经登录的方法    '''    def __init__(self):        super().__init__()  # 先执行tk这个类的初始化        self.title('登录界面')        # self.geometry('620x420')        self.resizable(0,0) # 窗体大小不允许变,两个参数分别代表x轴和y轴        self.iconbitmap('.'+os.sep+'img'+os.sep+'student.ico')        # self['bg'] = 'royalblue'        # 加载窗体        self.setup_UI()    def setup_UI(self):        # ttk中控件使用style对象设定        self.Style01 = Style()        self.Style01.configure('user.TLabel',font = ('华文黑体',20,'bold'),foreground = 'royalblue')        self.Style01.configure('TEntry',font = ('华文黑体',20,'bold'))        self.Style01.configure('TButton',font = ('华文黑体',20,'bold'),foreground = 'royalblue')        # 创建一个Label标签展示图片        self.Login_image = PhotoImage(file = '.'+os.sep+'img'+os.sep+'logingui.png')        self.Label_image = Label(self,image = self.Login_image)        self.Label_image.pack(padx = 10,pady = 10)        # 创建一个Label标签 + Entry   --- 用户名        self.Label_user = Label(self,text = '用户名:', style = 'user.TLabel')        self.Label_user.pack(side = LEFT,padx = 10,pady = 10)        self.Entry_user = Entry(self,width = 12)        self.Entry_user.pack(side = LEFT,padx = 10,pady = 10)        # 创建一个Label标签 + Entry   --- 密码        self.Label_password = Label(self, text = '密码:', style = 'user.TLabel')        self.Label_password.pack(side = LEFT,padx = 10,pady = 10)        self.Entry_password = Entry(self, width=12,show = '*')        self.Entry_password.pack(side = LEFT,padx = 10,pady = 10)        # 创建一个按钮    --- 登录        self.Button_login = Button(self,text = '登录',width = 4)        self.Button_login.pack(side = LEFT,padx = 20,pady = 10)if __name__ == '__main__':    this_login = LoginWindow()    this_login.mainloop()

效果:

图片.png

二、读取文件

读取文本中的的用户信息,记得先判断文件路径是否存在,如果文件不存在就弹一个弹窗,如果存在继续做异常处理是否能打开文件读取内容。按行读取,每一行再分割,分割后存储到user_list[]用户列表中。

def load_file_info(self):    if not os.path.exists(self.file_path):            showinfo('系统消息','提供的文件名不存在!')    else:        try:            with open(file = self.file_path,mode = 'r') as fd:               # 一次读一行                current_line = fd.readline()                while current_line:                    temp_list = current_line.split(',') # 长字符串分割层三个                    self.user_list.append(temp_list)                    # 读取下一行,读完了循环就结束了                    current_line = fd.readline()        except:            showinfo('系统消息','文件读取出现异常!')

存储用户信息的文本文件路径作为全局变量存储,这样后面还会调用的时候就不需要重写方法,其它方法调用也会方便一些。 我们在初始化方法中定义全局变量:

# 定义变量(定义全局变量,后面的函数都能访问到)self.file_path = '/Users/yushengtan/Desktop/Demo/Studentmgr/User.txt'   # 文件路劲self.user_list = [] # 存储用户信息# 自动执行文件中账号的加载self.load_file_info()

三、获取输入账号的信息

需要在控件里捆绑变量,再定义一个login()方法,通过控件变量.get()方法获取输入的值,再给登录按钮添加一个command事件

def login(self):    # 获取用户的用户名和密码    user = self.var_user.get()    password = self.var_password.get()    showinfo(message='用户名:'+user+'密码:'+password)  # 暂时用弹窗测试一下内容获取是否正常

四、实现基本的身份验证

关于登录验证,要求如下:

  • 如果用户名不对,提示:用户名不存在

  • 如果密码不对,提示:密码错误

  • 如果密码连续输错三次,提示:账号已锁定,请联系管理员

  • 如果用户名和密码正确,加载主窗体实现基本身份验证的框架:

# 实现身份验证,遍历用户信息列表for index in range(len(self.user_list)):    # 用户名是否正确    if user.strip().lower() == str(self.user_list[index][0]).strip().lower():        # 判断账号是否被禁用        if '0' in str(self.user_list[index][2]).strip().lower():            showinfo('系统消息', '账号已禁用,请联系管理员')            break        # 密码是否正确        if password != str(self.user_list[index][1]).strip().lower():            showinfo('系统消息', '输入的密码错误')            # 判断成功后整个循环退出,不要执行后面的判断用户名不存在的语句了            break        else:            showinfo('系统消息', '登录成功!')            break    # 如果校验到最后都没有相同的用户名,则用户名不存在    if index == len(self.user_list) - 1:        showinfo('系统消息','输入的用户名不存在')

五、密码输错三次锁定账号

首先我们需要使用全局变量记录密码输错多少次,

def login(self):    # 获取用户的用户名和密码    user = self.var_user.get()    password = self.var_password.get()    # 实现身份验证,遍历用户信息列表    for index in range(len(self.user_list)):        # 用户名是否正确        if user.strip().lower() == str(self.user_list[index][0]).strip().lower():            # 判断账号是否被禁用            if '0' in str(self.user_list[index][2]).strip().lower():                showinfo('系统消息', '账号已禁用,请联系管理员')                break            # 密码是否正确            if password != str(self.user_list[index][1]).strip().lower():                self.var_password_error_times += 1                # 判读错误是否到三次                if self.var_password_error_times >= 3:                    showinfo('系统消息','密码错误已达三次,账号已锁定!')                    # 改变状态                    self.user_list[index][2] = '0\n'                    # 信息写入到文件                    self.write_file_info()                else:                    showinfo('系统消息', '输入的密码错误')                # 判断成功后整个循环退出,不要执行后面的判断用户名不存在的语句了                break            else:                # 如果在三次之内输入正确了,把错误次数归零                self.var_password_error_times = 0                showinfo('系统消息', '登录成功!')                break        # 如果校验到最后都没有相同的用户名,则用户名不存在        if index == len(self.user_list) - 1:            showinfo('系统消息','输入的用户名不存在')

将用户信息写入文件:

def write_file_info(self):    # 1.清空文件;2.写入    try:        with open(file = self.file_path,mode='w') as fd:            fd.write('')        with open(file = self.file_path,mode='a') as fd:            for item in self.user_list:                fd.write(','.join(item))    except:        showinfo('系统消息','写入文件出现异常')

六、完成主窗体的加载

创建一个主窗体maingui.py

from tkinter import *from tkinter.ttk import *class MainWindow(Tk):    def __init__(self):        super().__init__()        self.title('主窗体')        self.geometry('900x640+180+80')        self.resizable(0,0)        self['bg']='royalblue'

在登录窗体中再定义一个登录主窗体跳转方法:

def load_main(self):    # 关闭当前窗体    self.destroy()    # 加载新窗体    if __name__ == '__main__':        main_window = maingui.MainWindow()

在登录方法login()中,用户密码验证成功后,调用跳转主窗体的方法即可; 至此,我们登录窗体就已经搭建完成了!

最后

本节我们先整体介绍了一下该项目的主要功能,然后就开始了项目的第一步:登录窗体的实现,实现了用户名和密码的校验功能,完成了登录窗体我们点击登录按钮希望能加载主窗体界面,这该如何实现呢?下一节,我们将介绍主窗体的界面的搭建和功能的实现。

(0)

相关推荐

  • 第8章——自动化测试综合实战

    自动化测试综合实战 项目背景 在 http://localhost/news/ 新闻子页面进行登录测试. 功能实现 · 自动运行用例 · 自动生成测试报告 · 自动断言与截图 · 自动将最新测试报告发 ...

  • Python的门面担当

    在大多数时候,我们都在黑黢黢的控制台里执行 Python 脚本.这看起来很酷很 GEEK.但对于部分场景下的用户来说,这样就不大美观和人性化了:我们需要交互更方便的图形化产品,也就是 GUI(图形用户 ...

  • 第7章——Python邮件发送

    Python邮件发送 SMTP(Simple Mail Transfer Protocol) · 即简单邮件传输协议.它是一组用于从源地址到目的地址传输邮件的规范,通过它来控制邮件的中转方式.SMTP ...

  • Python基础学习笔记(十三)图形化界面Tkinter

    本节知识大纲: 本节知识框架 Python里的图形化界面(GUI)模块主要有Tkinter(python自带).PyQt.wxPython,我们这节主要讲解Tkinter组件: 一.Tkinter介绍 ...

  • (CNVD-2021-17369 )|锐捷无线SmartWeb管理系统存在逻辑缺陷漏洞

    0x01 漏洞说明 锐捷无线SmartWeb管理系统存在逻辑缺陷漏洞,攻击者可从低权限用户(guest/guest)获取到管理员账号密码以及存在的用户账号密码.密码为base64编码. 0x02 影响 ...

  • 用Python创建你第一个GIS程序[3]:前后端搭建

    前言:为了区分说明,我们这里也用前端后端这个概念来阐述.本章节使用简单的案例,分别展示前后端的代码,包括一个简单前端 GUI 界面的搭建流程和代码. 后端 为了区分说明,我们这里也用前端后端这个概念来 ...

  • Python GUI项目实战(二)主窗体的界面设计与实现

    前言 上一节我们介绍了Python GUI项目实战(一)登录窗体的设计与实现,实现了该项目登录窗体的GUI的搭建,用户的账号和密码校验完成后应当跳转到主窗体界面,这一节我们将具体介绍主窗体界面的设计与 ...

  • 第71天: Python Scrapy 项目实战

    爬虫编写流程 首先明确 Python 爬虫代码编写的流程:先直接打开网页,找到你想要的数据,就是走一遍流程.比如这个项目我要爬取历史某一天所有比赛的赔率数据.每场比赛的比赛结果等. 那么我就先打开这个 ...

  • Python 小项目实战了解一下?

    来源:Python 技术「ID: pythonall」 最近无论是北方还是南方都迎来了强冷空气的袭击,北风呼呼吹,我所在的城市这两天则可随处溜冰,城市道路结冰橙色预警,全省交通到处管制.小学幼儿园停课 ...

  • 4个Python经典项目实战,程序员练手必备!

    Python是一种极具可读性和通用性的编程语言.Python这个名字的灵感来自于英国喜剧团体Monty Python,它的开发团队有一个重要的基础目标,就是使语言使用起来很有趣.Python易于设置, ...

  • [前端]GOFLY项目-响应式登录页的设计和实现

    登录界面如果要实现响应式 , 需要注意宽度的设置和media query的使用 宽度一般都是按百分比设置,当页面中百分比也满足不了的时候,可以使用media query区分出当前屏幕的宽度 根据不同的 ...

  • (附电子书和源码下载) 510页的《Python爬虫开发与项目实战》

    关于这本书 本书是Python爬虫入门非常经典的一本书,无数人通过这本书入门了Python爬虫,相信你也可以. 源码地址:https://github.com/qiyeboy/spiderbook 本 ...

  • Python项目实战练习:制作小型图书管理系统

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于IT丛林 ,作者: IT丛林 说明:此程序适合入门基本练习. 私信回 ...

  • 第113天: Python XGBoost 算法项目实战

    Python 实现机器学习 如果你的机器学习预测模型表现得不尽如人意,那就用XGBoost.XGBoost算法现在已经成为很多数据工程师的重要武器. XGBoost 算法 说到XGBoost,不得不提 ...

  • Python项目实战——手把手教你使用Django框架实现支付宝付款

    回复"书籍"即可获赠Python从入门到进阶共10本电子书 近乡情更怯,不敢问来人. 一.前言 春节即将来临,大家肯定各种掏腰包花花花,小编相信大家在支付时候,微信.支付宝支付肯定 ...