pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果

pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果

本人新手,刚入门python GUI,不足之处多多指教。
一、搭建环境,如下

from PySide2.QtWidgets import QApplication, QMessageBox,QTreeWidgetItem
from PySide2.QtUiTools import QUiLoader
import MySQLdb
import random

1、首先是pyside2
先pip install wheel
再pip insatll pyside2
找到里面的designer.exe
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第1张图片

注意:第一次运行程序的时候出现了一个no platform的错误(就是pyside2不能直接调用)
网上查找了一下。有两个解决方法:
1)把platform文件移到与designer.exe同级。
2)添加或者删除环境变量。
。。。我当时好像是放到同级以后,添加了一个系统环境变量,再重启电脑一次可以运行了。具体还不确定,等后面确认后再更新。
2、安装MySQLdb
python3装 pip install mysqlclient
一般装不上,得手动下一个whl文件。
按这个这个博主的方法
注意:然而我下了以后还是装不上,显示whl文件is not a valid file,重启电脑以后安装上了。(挺迷的,不知道为什么)

import MySQLdb#没报错就成功了

数据库可视化用的phpstudy+Navicat for MySQL
就比较玄学,学网络安全装的应用,拿去连接数据库,就这样把2333
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第2张图片二、实验结果
0、加两行代码,换个图标。

from PySide2.QtGui import  QIcon
app.setWindowIcon(QIcon('logo.png'))

pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第3张图片

1、注册
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第4张图片2、查询
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第5张图片

3、导入数据库
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第6张图片pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第7张图片4、注册任务,左边树控件,右边列控件。将右边的任务注册过去,形成一颗树。
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第8张图片5、给药品分发一个key,hash的时候用
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第9张图片6、把任务移回来
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第10张图片

三、编写代码
这里只进行一部分讲解了。 代码介绍和ui编写
1、代码介绍
可以再python3.vip里面学一学入门的,讲的不错。
注:数据库密码打的‘。。。’
1)init 动态导入ui文件 加上创建数据表

def __init__(self):
        # 从文件中加载UI定义
        # 从 UI 定义中动态 创建一个相应的窗口对象
        # 注意:里面的控件对象也成为窗口对象的属性了
        # 比如 self.ui.button , self.ui.textEdit
        self.ui = QUiLoader().load('药品管理.ui')
        self.ui.pushButton_2.clicked.connect(self.handleall)
        self.ui.pushButton_3.clicked.connect(self.query)
        self.ui.pushButton_5.clicked.connect(self.daoru)
        self.ui.pushButton.clicked.connect(self.zhucerenwu)
        self.ui.pushButton_4.clicked.connect(self.yichurenwu)
        self.ui.pushButton_6.clicked.connect(self.fenfa)
        self.ui.pushButton_7.clicked.connect(self.sort)


import MySQLdb#创建数据表

# 打开数据库连接
db = MySQLdb.connect("localhost", "root", "。。。","test", charset='utf8' )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 插入语句
# SQL 查询语句
cursor.execute("DROP TABLE IF EXISTS yaopin")

# 创建数据表SQL语句
sql = """CREATE TABLE YAOPIN (
         ID  CHAR(20) PRIMARY KEY,
         NAME  CHAR(20),
         OFFICE  CHAR(20),
         MANAGER  CHAR(20),
         IP  CHAR(20)
          )"""

cursor.execute(sql)

# 关闭数据库连接
db.close()

2)handleall方法,根据自己情况设置输入限制。我这边是handleid函数和handleother函数处理,判断正确返回真,错误返回假,并消息提示。只有一直真才能继续执行。

def handleall(self):
        x1=self.ui.lineEdit.text()#id
        if self.handleid(x1):
            x2=self.ui.lineEdit_2.text()#name
            if self.handleother(x2):
                x3=self.ui.lineEdit_6.text()#office
                if self.handleother(x3):
                    x4=self.ui.lineEdit_4.text()#manager
                    if self.handleother(x4):
                        x5=self.ui.lineEdit_5.text()#ip
                        if self.handleother(x5): 
                            db = MySQLdb.connect("localhost", "root", "。。。","test", charset='utf8' )

                            # 使用cursor()方法获取操作游标 
                            cursor = db.cursor()

                            # SQL 插入语句
                            sql = "INSERT INTO yaopin(ID, \
                                   NAME,OFFICE,MANAGER,IP) \
                                   VALUES ('%s', '%s', '%s', '%s', '%s' )" % \
                                   (x1,x2,x3,x4,x5)
                            try:
                               # 执行sql语句
                               cursor.execute(sql)
                               # 提交到数据库执行
                               db.commit()
                               QMessageBox.about(self.ui,'正常','注册成功')
                               #self.ui.lineEdit.clear()
                               self.ui.lineEdit_2.clear()
                               self.ui.lineEdit_4.clear()
                               self.ui.lineEdit_5.clear()
                               self.ui.lineEdit_6.clear()
                            except Exception as e:
                               # Rollback in case there is any error
                               db.rollback()
                               print('错误:',e)
                               QMessageBox.critical(self.ui,'错误',f'错误类型:{e}')
                               
                            # 关闭数据库连接
                            db.close()
  

3)buttom-query

def query(self):
        x1=self.ui.lineEdit_3.text()
        if self.handleid(x1):
            db = MySQLdb.connect("localhost", "root", "。。。","test", charset='utf8' )
            cursor = db.cursor()
            sql = "SELECT * FROM yaopin where ID='%s'" %(x1)
            try:
               cursor.execute(sql)
               i=cursor.fetchall()
               i=i[0]
               QMessageBox.about(self.ui,'返回数据',f'id:{i[0]}\nname:{i[1]}\noffice:{i[2]}\nmanager:{i[3]}\nip:{i[4]}')
               self.ui.lineEdit_3.clear()
            except:
               QMessageBox.about(self.ui,'提示','数据库中无该数据')
            db.close() 

4)buttom-daoru

def daoru(self):
        self.ui.listWidget.clear()
        db = MySQLdb.connect("localhost", "root", "。。。","test", charset='utf8' )
        cursor = db.cursor()
        sql = "SELECT * FROM yaopin "
        try:
            cursor.execute(sql)
            data4=cursor.fetchall()
            for i in data4:
                self.ui.listWidget.addItem(f'{i[0]}:{i[1]}')
                #只导入了1.2项
        except Exception as e:
            print('错误:',e)
        db.close()

5)buttom-注册任务

def zhucerenwu(self):
        data1=self.ui.treeWidget.selectedItems()#选中一列或多列
        data2=self.ui.listWidget.selectedItems()#选中一列或多列
        for i in data2:#先索引值,再切断连接,再移除
            self.ui.listWidget.removeItemWidget(self.ui.listWidget.takeItem(self.ui.listWidget.row(i)))
        if data1==[]:#开始为空,自建根节点
            if data2!=[]:#改一个小bug
                root = QTreeWidgetItem(self.ui.treeWidget)
                root.setText(0,f'{data2[0].text()}')
            else:
                pass
        else:#不为空,在指定节点下填入所有任务
            for i in data2:
                child=QTreeWidgetItem(data1[0])
                child.setText(0,f'{i.text()}')
                #树控件的用法!!!!0在外面指定。0就是树控件第一列。
                #i.text()是列表控件的内容,直接调用就行。

6)buttom-移除任务

def yichurenwu(self):
        root= QTreeWidgetItem(self.ui.treeWidget)#实例一个根,后面会删除
        data3=self.ui.treeWidget.selectedItems()
        for i in data3:
            root.removeChild(i)#选择的全部删除
            #根节点删除,下面的叶节点会自动删除
            if i.text(0)[:3]!='key':#不是key的才能转过去
                self.ui.listWidget.addItem(f'{i.text(0)}')
                #i.text(0)是树控件的内容
                #树表控件用法,0在里面指定,代表选中的树控件第一列!!!
        root.removeChild(root)#把自己删除

7)buttom-fenfa

def fenfa(self):
        data4=self.ui.treeWidget.selectedItems()
        data4=data4[0]
        if data4.child(0)==None:#子节点空
            QMessageBox.about(self.ui,'提示','该任务无子任务')
        else:
            i=0
            while data4.child(i)!=None:#所有子节点遍历添加
                ch=QTreeWidgetItem(data4.child(i))
                ch.setText(0,f'key={random.randint(100000,999999)}')
                i+=1

8)buttom-sort

def sort(self):
        self.ui.listWidget.sortItems()#列表类的排序方法

注意:
1)两个控件删除方法不一样。树建根再删除根,列表索引断开联系再删除。
2)写sql语句,%s要写成‘%s’。
3)索引树控件,判断为不为空的几个情况。
4)树控件文本是i.text(0),选中的第一列。列控件文本直接i.text(),不用选。
2、ui介绍
刚入门,加上美工一般,勿喷。
总的来说就4步,借鉴白月黑羽老师的总结
第一步:建好所有小控件
第二步:小控件内部布局连接好
第三步:小控件组成的整体布局连接好
第四步:美工调整,可以用css和调整strength
pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第11张图片

pyside2入门–药品管理ui,从搭建环境到代码编写,调试,实验结果_第12张图片

你可能感兴趣的:(pyside2入门,python工具,python)