目前勉强有点用了,仍在更新中。
※ 目前有一个没解决的小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 = 0
self.username = 0
super().__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 0
t_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")
continue
else:
self.le.setText(t_username)
break
else:
return 0
if 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!")
continue
else:
self.le.setText("success")
self.st.setText(f' username:{t_username}')
self.loged = 1
self.username = t_username
break
return 0
else:
return 0
def log_out(self):
self.st.setText(' Not logged in')
self.loged = 0
def 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")
continue
else:
self.le.setText(t_username)
break
return 0
else:
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 0
else:
self.le.setText('Wrong Answer!')
return 0
else:
return 0
Dict['password'] = t_password
self.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:
continue
else:
Dict = eval(line)
break
if t_item == 'N':
t_username, ok = QInputDialog.getText(self, 'Edit\'s Item', 'Enter your name:')
Dict['username'] = t_username
self.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 = 0
if t_item == 'C+':
a += 1
elif t_item == '0':
a = 0
else:
a -= 1
Dict['Check-in_Point'] = a
self.replace_line(text, self.username, str(Dict))
self.le.setText('Successfull Edit!')
else:
return 0
if __name__ == '__main__':
# 每一pyqt5应用程序必须创建一个应用程序对象。sys.argv参数是一个列表,从命令行输入参数。
app = QApplication(sys.argv)
ex = Example()
# 系统exit()方法确保应用程序干净的退出
# 的exec_()方法有下划线。因为执行是一个Python关键词。因此,exec_()代替
sys.exit(app.exec_())