Python日报0507 - PyQt5实现打卡登记系统
目前勉强有点用了,仍在更新中。
※ 目前有一个没解决的小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实现打卡登记系统相关推荐
- 基于Python语言和PyQt5的铁路列车运行图系统
概述 本项目是基于Python语言和PyQt5的非官方性质.简易的中国铁路列车运行图系统.本代码的发布遵循GPLv3协议.在协议允许范围内,作者保留一切权利和最终解释权. 与ETRC的联系 渊源 py ...
- 【Python笔记】pyqt5进度条-多线程图像分块处理防止窗体卡顿
目录 主要功能 环境配置 实现过程 1.设计ui 主界面 弹出框 窗体文件 2.主体实现 打开文件 计算函数 代码附录 title.ui titleok.ui title.py titleok.py ...
- 使用python和pyqt5轻松上手人脸识别系统(含代码)
使用python和pyqt5轻松上手人脸识别系统(含代码) 一. 环境配置 1.1 python环境配置 1.1.1 安装 anaconda 1.1.2 安装pycharm 1.1.3 配置pip源 ...
- python实现易统计自动打卡
最近被老师安排提醒班级同学打卡,看到每天很多人忘记打就很心累,想着弄个自动打卡的,于是网上巴拉了一下,找到了主要接口.具体方法如下: 一.获取token值 每个用户都有固定的且不变的一个token值, ...
- 百度AI人脸识别与检测二:学生人脸识别打卡签到系统主界面功能需求和设计以及通过Python实现界面运行
<百度AI人脸识别与检测>专栏为项目专栏,从零到一,从无到有开发一个学生人脸识别签到系统:主要用到的技术有百度开放平台中的人脸检测.人脸识别.Python图形界面开发PyQt5.线程的管理 ...
- Python gui编程pyQt5安装步骤
Python gui编程pyQt5安装步骤 =============================== -m PyQt5.uic.pyuic $FileName$ -o $FileNameWit ...
- python 天气预报 mysql_Python+PyQt5+MySQL实现天气管理系统
在本篇博客中,我利用Python语言其编写界面库PyQt5,然后通过连接MySQL数据库,实现了一个简单的天气管理小系统,该系统包含简单的增删查改四个主要功能.本文旨在解析实现的程序,能够让读者快速了 ...
- Python 小白从零开始 PyQt5 项目实战(8)汇总篇(完整例程)
本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战.不跳过一个细节,不漏掉一行代码,不省略一个例图. 本系列从软件安装.环境配置开始,介绍了基本应 ...
- Python 小白从零开始 PyQt5 项目实战(7)折叠侧边栏的实现
单式状态栏,位于于窗口的左右侧边,可以实现软件功能或目录的导航. 本文详细介绍用 QTreeWidget 部件实现目录结构的折叠侧边栏,与用 QToolBox 部件实现垂直菜单结构的折叠侧边栏,通过案 ...
- Python 小白从零开始 PyQt5 项目实战(5)布局管理
本系列面向 Python 小白,从零开始实战解说应用 QtDesigner 进行 PyQt5 的项目实战. 什么叫从零开始?从软件安装.环境配置开始.不跳过一个细节,不漏掉一行代码,不省略一个例图. ...
最新文章
- (转)Linux系统调用和库函数调用的区别
- 全排列两种实现方式(java)—poj2718
- oracle中decode和case的使用例子
- android官方文档中文版_最全实至名归,NumPy 官方早有中文教程,结合深度学习,还有防脱发指南...
- 学习笔记整理之StringBuffer与StringBulider的线程安全与线程不安全
- linux----------今天又遇到一个奇葩的问题,就是linux文件的权限已经是777了但是还是没有写入权限,按照下面的命令就解决了
- 手工机器人的做法大全用易拉罐_快来吃“智能机器人炒饭”啦!顾客:比人工炒饭还好吃!...
- sap gui java_不喜欢SAP GUI?那试试用Eclipse进行ABAP开发吧
- 樱桃OTC前工程师感恩自白
- python热力相关系数图_【Python可视化6】Seaborn之heatmap热力图
- 情人节——vbs的学习(句子、情话)
- android平板 代码禁用wifi模块,使平板电脑无线模块禁用的方法
- 地球上最长的两座山脉:一座4800公里,一座8900公里
- 自动适配跳转电脑PC端和手机WAP端
- MySQL笔记---DQL语言
- 计算机房七氟丙烷气体灭火系统设计 施工安,计算机房七氟丙烷气体灭火系统...
- Windows重定向技术【文件重定向与注册表重定向】
- 如何禁止计算机被网络访问,局域网内如何禁止别人访问自己的电脑
- 《卸甲笔记》-单行函数对比之二
- 席裕庚《预测控制》学习记录 (一)-基于阶跃响应的动态矩阵控制(DMC)包含仿真