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 = 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_())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值