本人新手,刚入门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
注意:第一次运行程序的时候出现了一个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
二、实验结果
0、加两行代码,换个图标。
from PySide2.QtGui import QIcon
app.setWindowIcon(QIcon('logo.png'))
3、导入数据库
4、注册任务,左边树控件,右边列控件。将右边的任务注册过去,形成一颗树。
5、给药品分发一个key,hash的时候用
6、把任务移回来
三、编写代码
这里只进行一部分讲解了。 代码介绍和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