目前勉强有点用了,仍在更新中。
※ 目前有一个没解决的小bug,用户序列文件userline和administrator都需要在使用前准备一行初始文本,也就是不能为空。否则会有直接登录无法提示用户不存在的bug。(虽然依然无法登录)

import sys# 这里我们提供必要的引用。基本控件位于pyqt5.qtwidgets模块中。
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *# QWidget部件是pyqt5所有用户界面对象的基类。他为QWidget提供默认构造函数。默认构造函数没有父类。
# 基于QMainWindow组件,因为我们中心需要设置一个文本编辑框组件。
class Example(QMainWindow):def __init__(self):self.A_mod = 'B'self.loged = 0self.username = 0super().__init__()self.initUI()  # 界面绘制交给InitUi方法def initUI(self):# 这种静态的方法设置一个用于显示工具提示的字体。我们使用10px滑体字体。QToolTip.setFont(QFont('SansSerif', 16))# 创建一个提示,我们称之为settooltip()方法。我们可以使用丰富的文本格式self.setToolTip('Hello')# 注册按钮实现# 创建一个PushButton并为他设置一个tooltip# 构造方法的第一个参数是显示在button上的标签文本。第二个参数是父组件。self.sbtn = QPushButton('Sign Up', self)self.sbtn.setToolTip('Sign up your account')# btn.sizeHint()显示默认尺寸self.sbtn.resize(300, 100)self.sbtn.move(300, 50)  # 移动按钮位置self.sbtn.clicked.connect(self.sign_up)   # sign按钮对接sign_up对话框# 退出程序按钮实现qbtn = QPushButton('Quit', self)qbtn.setToolTip('Quit the program')qbtn.clicked.connect(QCoreApplication.instance().quit)qbtn.resize(300, 100)qbtn.move(300, 250)# 管理员模式实现cb = QCheckBox('Administrator mode', self)# cb.toggle()   默认勾选cb.move(20, 20)cb.resize(200, 50)cb.stateChanged.connect(self.change_A_mod)# 登录Ibtn = QPushButton('Log In', self)Ibtn.setToolTip('Log in to your account')Ibtn.clicked.connect(self.log_in)Ibtn.resize(300, 100)Ibtn.move(300, 150)# 登出Obtn = QPushButton('Log Out', self)Obtn.setToolTip('Log out of your account')Obtn.clicked.connect(self.log_out)Obtn.resize(300, 100)Obtn.move(600, 150)# 忘记密码rbtn = QPushButton('Reset Password', self)rbtn.setToolTip('Answer your guarder\'s Question')rbtn.clicked.connect(self.reset_password)rbtn.resize(300, 100)rbtn.move(600, 250)# 编辑ebtn = QPushButton('Edit', self)ebtn.setToolTip('Edit intelligence')ebtn.clicked.connect(self.edit)ebtn.resize(300, 100)ebtn.move(300, 400)# 单行编辑框显示文本反馈self.le = QLineEdit(self)self.le.move(300, 350)self.le.resize(300, 50)self.le.setFocusPolicy(Qt.NoFocus)  # 禁止编辑# 单行编辑框实现登录状态记录self.st = QLineEdit(self)self.st.move(650, 50)self.st.resize(300,50)self.st.setFocusPolicy(Qt.NoFocus)self.st.setText('                   Not logged in')# 单行编辑框显示用户信息反馈self.le = QLineEdit(self)self.le.move(300, 500)self.le.resize(600, 50)# 设置窗口的位置和大小self.setGeometry(600, 600, 1000, 660)# 设置窗口的标题self.setWindowTitle('Information Management System')# 设置窗口的图标,引用当前目录下的web.png图片self.setWindowIcon(QIcon('body.png'))# 将窗口居中放置的代码在自定义的center()方法中。self.center()# 显示窗口self.show()def closeEvent(self, event):# 如果我们关闭一个QWidget,QCloseEvent类事件将被生成。要修改组件动作我们需要重新实现closeEvent()事件处理方法。# 我们实现一个带两个按钮的message box:YES和No按钮。代码中第一个字符串的内容被显示在标题栏上。第二个字符串是对话框上显示的文本。# 第三个参数指定了显示在对话框上的按钮集合。最后一个参数是默认选中的按钮。这个按钮一开始就获得焦点。返回值被储存在reply变量中reply = QMessageBox.question(self, 'Message',"Are you sure to quit?", QMessageBox.Yes |QMessageBox.No, QMessageBox.No)if reply == QMessageBox.Yes:event.accept()else:event.ignore()def center(self):# 屏幕居中窗口qr = self.frameGeometry()  # 获得主窗口的一个矩形特定几何图形。这包含了窗口的框架。cp = QDesktopWidget().availableGeometry().center()  # 算出相对于显示器的|绝对值|?。# 并且从这个|绝对值|中,我们获得了屏幕中心点。qr.moveCenter(cp)  # 矩形已经设置好了它的宽和高。现在我们把矩形的中心设置到屏幕的中间去。# 矩形的大小并不会改变。self.move(qr.topLeft())  # 移动了应用窗口的左上方的点到qr矩形的左上方的点,因此居中显示在我们的屏幕上。def sign_up(self):"""open 函数语法:file object = open(file_name [, access_mode][, buffering])file_name:  file_name变量是一个包含了你要访问的文件名称的字符串值。access_mode: access_mode决定了打开文件的模式:只读,写入,追加等。所有可取值见如下的完全列表。这个参数是非强制的,默认文件访问模式为只读(r)。buffering:  如果buffering的值被设为0,就不会有寄存。如果buffering的值取1,访问文件时会寄存行。如果将buffering的值设为大于1的整数,表明了这就是的寄存区的缓冲大小。如果取负值,寄存区的缓冲大小则为系统默认。"""# 判断是否为管理员if self.A_mod == 'A':text = 'administrator'else:text = 'userline'# 用户名t_username, ok = QInputDialog.getText(self, 'sign your username','Enter your name:')if ok:self.le.setText(t_username)else :return 0# 密码t_password, ok = QInputDialog.getText(self, 'difine your password','Enter your password:')if ok:self.le.setText(t_password)else :return 0# 密保t_guarder_Q, ok = QInputDialog.getText(self, 'set your password guarder Q&A','Enter your password guarder\'s Question:')if ok:self.le.setText(t_guarder_Q)else :return 0t_guarder_A, ok = QInputDialog.getText(self, 'set your password guarder Q&A','Enter your password guarder\'s Answer:')if ok:self.le.setText(t_guarder_A)else :return 0# 保存newguy = {'username': t_username, 'password': t_password,'guarder_Q': t_guarder_Q, 'guarder_A': t_guarder_A}op = open(text, "a")op.write(str(newguy) + '\n')def log_in(self):# 判断是否为管理员if self.A_mod == 'A':text = 'administrator'else :text = 'userline'# 判断用户名t_username, ok = QInputDialog.getText(self, 'log in', 'Enter your name:')if ok:for line in open(text, "r+"):if line.find(f"\'username\': \'{t_username}\'") == -1:self.le.setText("\'" + t_username + "\'" + ' ' + "unsigned")continueelse:self.le.setText(t_username)breakelse:return 0if self.le.text() != t_username:return 0# 判断密码t_password, ok = QInputDialog.getText(self, 'log in', 'Enter your password:')if ok:for line in open(text, "r+"):if line.find(f"\'username\': \'{t_username}\', \'password\': \'{t_password}\'") == -1:self.le.setText("Wrong Password!")continueelse:self.le.setText("success")self.st.setText(f'                  username:{t_username}')self.loged = 1self.username = t_usernamebreakreturn 0else:return 0def log_out(self):self.st.setText('                   Not logged in')self.loged = 0def reset_password(self):# 判断是否为管理员if self.A_mod == 'A':text = 'administrator'else:text = 'userline'# 判断用户名t_username, ok = QInputDialog.getText(self, 'reset password','Enter your name:')if ok:for line in open(text, "r"):if line.find(f"\'username\': \'{t_username}\'") == -1:self.le.setText("\'" + t_username + "\'" + ' ' + "unsigned")continueelse:self.le.setText(t_username)breakreturn 0else:return 0# 判断密保问题Dict = eval(line)Question = Dict.get('guarder_Q')Answer = Dict.get('guarder_A')t_answer, ok = QInputDialog.getText(self, 'reset password', f'{Question}?')if ok:if t_answer == Answer:# 重设密码t_password, ok = QInputDialog.getText(self, 'difine your password','Enter your password:')if ok:self.le.setText(t_password)else:return 0else:self.le.setText('Wrong Answer!')return 0else:return 0Dict['password'] = t_passwordself.replace_line(text, Dict['username'], str(Dict))def change_A_mod(self, state):if state == Qt.Checked:self.A_mod = 'A'else:self.A_mod = 'B'def replace_line(self, text, user_name, content):with open(text, 'r') as f:# readlines以列表的形式将文件读出lines = f.readlines()with open(text, 'w') as f_w:for line in lines:if f"{{\'username\': \'{user_name}\'," in line:line = line.replace(str(line), content + '\n')f_w.write(line)def edit(self):# 判断是否为管理员if self.A_mod == 'A':text = 'administrator'else:text = 'userline'# 选择编辑项目t_item, ok = QInputDialog.getText(self, 'Edit\'s Item', 'Name:N, Check-in:C+/C-/0')if ok:# 提取用户信息行for line in open(text, "r"):if line.find(f"\'username\': \'{self.username}\'") == -1:continueelse:Dict = eval(line)breakif t_item == 'N':t_username, ok = QInputDialog.getText(self, 'Edit\'s Item', 'Enter your name:')Dict['username'] = t_usernameself.replace_line(text, self.username, str(Dict))self.le.setText('Successfull Edit!')if t_item == 'C+' or t_item == 'C-' or t_item == '0':a = Dict.setdefault('Check-in_Point')if a is None: a = 0if t_item == 'C+':a += 1elif t_item == '0':a = 0else:a -= 1Dict['Check-in_Point'] = aself.replace_line(text, self.username, str(Dict))self.le.setText('Successfull Edit!')else:return 0if __name__ == '__main__':# 每一pyqt5应用程序必须创建一个应用程序对象。sys.argv参数是一个列表,从命令行输入参数。app = QApplication(sys.argv)ex = Example()# 系统exit()方法确保应用程序干净的退出# 的exec_()方法有下划线。因为执行是一个Python关键词。因此,exec_()代替sys.exit(app.exec_())

Python日报0507 - PyQt5实现打卡登记系统相关推荐

  1. 基于Python语言和PyQt5的铁路列车运行图系统

    概述 本项目是基于Python语言和PyQt5的非官方性质.简易的中国铁路列车运行图系统.本代码的发布遵循GPLv3协议.在协议允许范围内,作者保留一切权利和最终解释权. 与ETRC的联系 渊源 py ...

  2. 【Python笔记】pyqt5进度条-多线程图像分块处理防止窗体卡顿

    目录 主要功能 环境配置 实现过程 1.设计ui 主界面 弹出框 窗体文件 2.主体实现 打开文件 计算函数 代码附录 title.ui titleok.ui title.py titleok.py ...

  3. 使用python和pyqt5轻松上手人脸识别系统(含代码)

    使用python和pyqt5轻松上手人脸识别系统(含代码) 一. 环境配置 1.1 python环境配置 1.1.1 安装 anaconda 1.1.2 安装pycharm 1.1.3 配置pip源 ...

  4. python实现易统计自动打卡

    最近被老师安排提醒班级同学打卡,看到每天很多人忘记打就很心累,想着弄个自动打卡的,于是网上巴拉了一下,找到了主要接口.具体方法如下: 一.获取token值 每个用户都有固定的且不变的一个token值, ...

  5. 百度AI人脸识别与检测二:学生人脸识别打卡签到系统主界面功能需求和设计以及通过Python实现界面运行

    <百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...

  6. Python gui编程pyQt5安装步骤

    Python gui编程pyQt5安装步骤 =============================== -m PyQt5.uic.pyuic  $FileName$ -o $FileNameWit ...

  7. python 天气预报 mysql_Python+PyQt5+MySQL实现天气管理系统

    在本篇博客中,我利用Python语言其编写界面库PyQt5,然后通过连接MySQL数据库,实现了一个简单的天气管理小系统,该系统包含简单的增删查改四个主要功能.本文旨在解析实现的程序,能够让读者快速了 ...

  8. Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程)

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战.不跳过一个细节,不漏掉一行代码,不省略一个例图. 本系列从软件安装.环境配置开始,介绍了基本应 ...

  9. Python 小白从零开始 PyQt5 项目实战(7)折叠侧边栏的实现

    单式状态栏,位于于窗口的左右侧边,可以实现软件功能或目录的导航. 本文详细介绍用 QTreeWidget 部件实现目录结构的折叠侧边栏,与用 QToolBox 部件实现垂直菜单结构的折叠侧边栏,通过案 ...

  10. Python 小白从零开始 PyQt5 项目实战(5)布局管理

    本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...

最新文章

  1. (转)Linux系统调用和库函数调用的区别
  2. 全排列两种实现方式(java)—poj2718
  3. oracle中decode和case的使用例子
  4. android官方文档中文版_最全实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
  5. 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全
  6. linux----------今天又遇到一个奇葩的问题,就是linux文件的权限已经是777了但是还是没有写入权限,按照下面的命令就解决了
  7. 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
  8. sap gui java_不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
  9. 樱桃OTC前工程师感恩自白
  10. python热力相关系数图_【Python可视化6】Seaborn之heatmap热力图
  11. 情人节——vbs的学习(句子、情话)
  12. android平板 代码禁用wifi模块,使平板电脑无线模块禁用的方法
  13. 地球上最长的两座山脉:一座4800公里,一座8900公里
  14. 自动适配跳转电脑PC端和手机WAP端
  15. MySQL笔记---DQL语言
  16. 计算机房七氟丙烷气体灭火系统设计 施工安,计算机房七氟丙烷气体灭火系统...
  17. Windows重定向技术【文件重定向与注册表重定向】
  18. 如何禁止计算机被网络访问,局域网内如何禁止别人访问自己的电脑
  19. 《卸甲笔记》-单行函数对比之二
  20. 席裕庚《预测控制》学习记录 (一)-基于阶跃响应的动态矩阵控制(DMC)包含仿真

热门文章

  1. 华硕无线网卡测试软件,高端便携无线网卡来了 华硕USB-AC68首测
  2. 移动端网站设计需要注意的四要点
  3. abaqus质量缩放系数取值_ABAQUS的质量缩放
  4. akka-typed(10) - event-sourcing, CQRS实战
  5. Android变声(SoundTouch)
  6. java -verbose命令
  7. java怎么画竖线_画竖线的4种方法
  8. c语言竖线什么意思,竖线符号意思
  9. Nuscenes——环视相机下BEV时序融合:前后帧空间对齐操作
  10. 达梦数据库ZYJ实例安装初始化