使用pyqt5+sqlalchemy+sqlite3打造windos窗口程序(一)登录_水木清华1986的博客-程序员宅基地

技术标签: python  sqlite3  pyqt  

为了熟悉pyqt5应用,专门写的这么一个小应用,主要是进行从前台界面,到事件交互,然后到数据的增删改查,最后是数据库的存储,所有的程序开发都是一个套路,只是流程不一样,掌握了基本过程,处理其他的都可以照猫画虎。

sqlalchemy是数据库层面的ORM框架,通过相关接口可以很方便的修改数据库,可以说sqlite,oracle,mysql等等。

import  sys
from PyQt5.QtWidgets import QLabel,QWidget,QToolTip,QPushButton,QLineEdit,QApplication,QGridLayout,QMessageBox
from PyQt5.QtGui import QFont
from PyQt5.QtCore import QCoreApplication,Qt
import db
import users
import time
class Login(QWidget):
    def __init__(self):
        super().__init__()
        # 创建Session类实例
        self.session = db.start()
        self.initUI()
        self.setFixedSize(self.width(), self.height())

    def initUI(self):
        #对齐

        userManage = QLabel('学生信息管理系统')
        userManage.setAlignment(Qt.AlignCenter)
        userManage.setFont(QFont("SansSerif",20))
        userManage.setStyleSheet("QLabel {color:while;}")
        username = QLabel('账号:')
        pssword = QLabel('密码:')
        global user_edit,pwd_edit
        user_edit =QLineEdit()
        pwd_edit =QLineEdit()

        QToolTip.setFont(QFont("SansSerif",10))
        btn1 = QPushButton("登录",self)
        btn1.resize(btn1.sizeHint())
        btn1.clicked.connect(self.login)

        btn2 = QPushButton("注册",self)
        btn2.resize(btn1.sizeHint())
        btn2.clicked.connect(self.register)

        btn3 = QPushButton("退出",self)
        btn3.setToolTip("exit programming")
        btn3.resize(btn1.sizeHint())
        btn3.clicked.connect(QCoreApplication.instance().quit)

        grid = QGridLayout()
        grid.addWidget(userManage,0,0,1,5)
        grid.addWidget(username,1,0)
        grid.addWidget(user_edit,1,1,1,4)
        grid.addWidget(pssword,2,0)
        grid.addWidget(pwd_edit,2,1,1,4)
        grid.addWidget(btn1,3,1,1,1)
        grid.addWidget(btn2,3,2,1,1)
        grid.addWidget(btn3,3,3,1,1)
        grid.setSpacing(30)
        # 设置水平间距
        grid.setHorizontalSpacing(10);
        # 设置垂直间距
        grid.setVerticalSpacing(10);
        # 设置外间距左上右下
        grid.setContentsMargins(30, 20, 30, 30)
        self.setLayout(grid)
        self.setGeometry(600,400,500,250) #设置位置和大小
        self.setWindowTitle("学生信息登录")
        self.show()
    def login(self):
        username = user_edit.text()
        password = pwd_edit.text()
        userinfo = self.session.query(db.Admin).filter_by(name=username,pwd=password).first()
        if userinfo:
                self.close()
                self.user = users.Users()
        else:
            QMessageBox.warning(self,"提示","账号或密码错误!", QMessageBox.Yes)
    def register(self):
        username = user_edit.text()
        password = pwd_edit.text()
        if username and password:
            userinfo = self.session.query(db.User).filter_by(name=username).first()
            if userinfo:
                QMessageBox.warning(self,"提示","用户名已存在!", QMessageBox.Yes)
            else:
                add_user = db.User(name=username,pwd=password,time=int(time.time()))
                self.session.add(add_user)
                self.session.commit()
                QMessageBox.information(self,"提示","注册成功!", QMessageBox.Yes)
        else:
            QMessageBox.warning(self,"提示","用户名或密码不能为空!", QMessageBox.Yes)
def start():
    app = QApplication(sys.argv)
    login = Login()
    sys.exit(app.exec_())
if __name__ == '__main__':
    app = QApplication(sys.argv)
    login = Login()
    sys.exit(app.exec_())

如果要进行管理员的注册,可以先将注册代码中的db.User改成db.Admin,注册成功后改回来就可以了。

这里没有单独加管理员注册,一般也就一个人,想加也可以加,复制下代码改下db.User就行了。

没有后面章节的代码,可以先将user,db,time相关内容先注销掉,也可以运行,就是无法实现登录,注册功能。

运行后的界面如下:

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/xiaoqiang3146/article/details/107406168

智能推荐

达梦数据库DM8-centos7环境安装(图文详情)-程序员宅基地

达梦数据库centos7安装图文详细达梦数据库centos7安装安装达梦数据库centos7安装达梦数据库产品下载页面:达梦产品下载页面下载rh7开发版即可我这里下载的是dm8_20201112_x86_rh7_64_ent_8.1.1.144.iso版本这里再放一个达梦云适配中心链接,里面的文档模块有很多官方教程,社区模块也可以查询或者提出各类使用问题达梦云适配中心安装1.新建dmdba用户groupadd dinstalluseradd -g dinstall -m -d /hom

eBPF/sockmap实现socket转发offload-程序员宅基地

通过代理服务器在两个TCP接连之间转发数据是一个非常常见的需求,然而这个代理服务器也是整条路径中的瓶颈之所在,代理服务器的七层转发行为极大地消耗着单机性能,所以通过代理服务器的七层转发优化,是一件必须要做的事情。*eBPF能否将代理程序的数据转发offload到内核呢?*如果可以做到,这就意味着这个offload可以达到和XDP offload相近的功效。在kubernetes环境下通过代理来执行L7策略代理(比如Envoy)执行额外的L7策略(Health checks, service disco_sockmap

Idea 解决 Could not autowire. No beans of ‘xxxx‘ type found 的错误提示_could not autowire. no beans of 'orderdao' type fo-程序员宅基地

Idea 解决 Could not autowire. No beans of 'xxxx' type found 的错误提示搬砖https://www.jb51.net/article/154488.htm这篇文章主要介绍了Idea 解决 Could not autowire. No beans of 'xxxx' type found 的错误提示,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧IntelliJ Idea 解决 Could not au._could not autowire. no beans of 'orderdao' type found.

Linux文档编辑命令-程序员宅基地

Linux文档编辑命令—col: col命令是一个标准输入文本过滤器,它从标准输入设备读取文本内容,并把内容显示到标注输出设备上。在许多UNIX说明文件里,都有RLF控制字符。当我们运用shell特殊字符>和>>,把说明文件的内容输出成纯文本文件时,控制字符会变成乱码,col命令则能有效滤除这些控制字符。

spark报错:java.nio.channels.ClosedChannelException & Couldn't connect to leader 处理_spark repartition报错java.nio.channels.closedchannel-程序员宅基地

上周修改了一个程序,上线后每过一段时间就会报错,并且直接卡住,不会自动结束。报错信息如下:19-10-27 19:01:07 ERROR org.apache.spark.executor.Executor:91 - Exception in task 6.0 in stage 7.0 (TID 80)java.nio.channels.ClosedChannelException....._spark repartition报错java.nio.channels.closedchannelexception

应用oracle job和存储过程-程序员宅基地

应用oracle job和存储过程 2008-05-27 20:19每月新增数据百万多条,需要定期处理2个主要数据表(test_ad,test_pd),移动非当月数据到历史表中保存数据操作存储过程如下:MYPROC.prccreate or replace procedure MYPROC isTableName_AD char(13);TableName_PD char(13);tmp_

随便推点

MySQL安装和配置_mysql ver 15.1 distrib 10.3.17-mariadb, for linux _slyybw的博客-程序员宅基地

MySQL基础1、关系型数据库介绍数据结构模型1.1 数据结构模型数据结构模型主要有:层次模型网状结构关系模型关系模型:二维关系:row,column数据库管理系统:DBMS关系:Relational,RDBMS1.2 RDBMS专业名词常见的关系型数据库管理系统:MySQL:MySQL,MariaDB,Percona-ServerPostgreSQL:简称为pgsqlOracleMSSQLSQL:Structure Query Language,结构化查询语言约束:co_mysql ver 15.1 distrib 10.3.17-mariadb, for linux (x86_64) using readline 5.

零基础入门数据挖掘 - 二手车交易价格预测-Task1赛题理解_一、题目说明: 1)根据训练样本训练“微型车”售价预测模型,预测目标字段为“price-程序员宅基地

目录一、赛题数据1.1 背景介绍1.2 字段表二、评判标准三、赛题相关3.1 明确目标3.2 了解赛题3.2.1 赛题概况(见1.1背景)3.2.2 数据概况(见1.2字段表)3.2.3 预测指标MAE3.2.4 分析赛题四、补充知识4.1 一般问题评价指标说明4.2 回归问题4.3 EDA4.4 他人经验附录一、赛题数据1.1 背景介绍  赛题以二手车市场为背景,要求选手以预测二手汽车的交..._一、题目说明: 1)根据训练样本训练“微型车”售价预测模型,预测目标字段为“price

自动化测试生成报告ReportNG_stata latex 自动化生成报告-程序员宅基地

自动化测试生成报告是一件非常重要的事情,报告的描述就决定了测试过程中的软件的bug问题,报告的易读性就非常重要,如果使用java做脚本的话选择性会小一点,ReportNG或许是最好的选择了,下面就是如何使用ReportNG生成对应的测试报告。首先准备jar包:按照对应的包名直接百度查询就可以了。写一个配置文件就放在src下面:test.xml内容:_stata latex 自动化生成报告

junjie -学习判断_weixuan 侯老师-程序员宅基地

# 1。上车的判断 tickets 票piao = input("你有几张票呀")piao = int(piao)# 如果 if 其他 else# 判断符号:> < == >= <= !=if piao > 0: print("请进站") booms = input("你有几个炸弹呀") booms=int(booms)..._weixuan 侯老师

PTA甲级考试真题练习22——1022 Digital Library_pta 甲级 1022-程序员宅基地

题目思路水题代码#include <iostream>#include <string>#include<algorithm>#include<vector>#include<stack>#include<map>#include<set>#include<queue>#inc..._pta 甲级 1022

后浪小萌新Python --- 守护线程-程序员宅基地

非守护线程:如果一个进程有多个线程,程序不会主线程结束以后就结束,而是在所有的线程都结束才结束守护线程:主线程序结束,子线程就结束(主线程结束,程序就结束)举例:import timefrom threading import Threaddef download(url): print('开始.....') time.sleep(10) print(url,'结束')if __name__ == '__main__': t1 = Thread(targ