一. 连接 Opengauss 数据库并设置弹窗
1.新建python文件“OpenGauss_GUI.py”,然后复制如下代码:
from PySide2.QtWidgets import QApplication,QMessageBox,QTableWidgetItem
from PySide2.QtUiTools import QUiLoader
import psycopg2
import sys
# 导入相关库
# 定义一个类专门处理GUI
class Stats:
def __init__(self):
# 从文件中加载UI定义
# 从 UI 定义中动态 创建一个相应的窗口对象
# 注意:里面的控件对象也成为窗口对象的属性了
# 比如 self.ui.button , self.ui.textEdit
self.ui = QUiLoader().load('G:\\CODE\\2019213061\\main.ui')
self.ui.setWindowTitle('你的学号')#设置窗口名称
# 定义一个连接OpenGauss的函数
def create_conn():
database='school'
user='dboper'
password='dboper@123'
host='192.168.174.134'
port='26000'
conn = psycopg2.connect(database=database, user=user, password=password, host=host, port=port) #连接数据库
return conn
#程序从这里执行
app = QApplication([])
stats = Stats()
stats.ui.show() # 界面显示
sys.exit(app.exec_())#事件处理循环 要不然程序一闪而过 死循环
右键点击“运行”后我们可以看到一个空的窗口,代表程序正常可以正常工作。QUiLoader().load()这里读取了我们之前创建的main.ui文件(建议写绝对路径),并生成了一个窗口对象返回到类变量ui中,接下来我们对窗口进行操作都需要用到类变量ui。
2. QMessageBox控件
QMessageBox控件可以用于生产弹窗,接下来我们来实现数据库的连接,在连接成功后给我们弹出一个提示窗口,失败的话将报错信息用弹窗进行显示stats = Stats()这段代码下加入下述代码:
msgBox = QMessageBox()
try:
conn = create_conn()
except Exception as e:
msgBox.about(stats.ui, '提示窗口', str(e))
else:
msgBox.about(stats.ui, '提示窗口', '数据库连接成功 ')#弹窗提示
在初始化弹窗对象msgBox,try语句下会先执行conn = create_conn(),如果出现异常则会获得报错信息e。没有异常则执行else:中的语句。
其中About()函数是QMessageBox()的类函数,用于弹出窗口,其中第一个参数需要填一个主窗口对象,也就是类变量ui,第二个参数是弹窗的标题,第三个参数则是弹窗的内容。
右键运行后可以观察到弹窗的出现(如果IP有误最终会因为超时报错)
这个时候不管是否连接成功,按下OK后会都会显示我们自己designer生成的主窗口中,因此我们根据try语句的性质将显示界面的那行代码放入else里,如下图所示
这样只有连接成功时才能进入主窗口中
二. 设计main.ui
选择“工具”→“工具”→“QtDesigner”启动designer,开启后我们先将左上角的菜单栏删掉,我们可以发现控件里面的对应菜单的menubar已经消失了
下图为designer设计界面的基本介绍:
在坐标工具栏中选择Label控件,将其拖到主窗口中进行编辑。双击刚刚拖出来的Label控件即可对其显示内容进行编辑,将其修改为“Opengauss 开发案例”并将其拖到可以显示全部文字的大小
这时如果要修改大小,可以右键点击“改变多信息文本”可以修改文本大小并进行格式编辑
如果要修改字体,则右键点击更改样式,点击添加字体即可。(几乎所有的控件都能进行这样的操作)更改后如右图所示
二. PushButton控件
1.在左边工具栏找到PushButton控件,将其拖入主窗口中,双击修改Button的内容为“关闭”,结果如下图所示:
可以根据自己的想法,更改PushButton内的文本字体与大小,已经PushButton本身的大小
2.在对象查看器找到PushButton,双击可以进行编辑,这里我们将其更改为“c_button”,代表该按钮的作用是关闭窗口,
接下来在Pycharm中我们就可以通过self.ui主窗口对象来调用它的成员变量(c_button对象)来实现关闭窗口的操作。
3.保存main.ui,返回到Pycharm中, 在
class Stats的构造函数def __init__(self):加入下述语句
self.ui.c_button.clicked.connect(self.close_main_window)#按钮按下 执行函数self.close_main_window
#加入类函数
def close_main_window(self):#关闭窗口
self.ui.close()
如下图所示:
关于添加的内容:
(1)self.ui.c_button.clicked.connect(self.close_main_window) 这段可以理解为调用了ui中的c_button对象启用了一个监听函数,其参数是一个函数名,这里我们填入的参数正是下面我们定义的关闭主窗口的类函数。
(2)close()为窗口类的类函数,调用后关闭该窗口,这里ui.close()就是只关闭窗口ui,如果还有其他窗口则不会受到影响
右键运行,可以看到我们刚才添加的label以及关闭按钮,按下“关闭后窗口消失”,程序运行结束
三. 添加表格控件
1.返回designer在工具栏搜索table,选择Table Widget控件
将其调整为合适的大小,右键选择“编辑项目”,即可添加行和列
(右键选择“改变样式”也可修改单元内文本的字体和大小),结果如下:
2.修改表格对象名,在对象查看器中找到“tableWidget”双击将其修改为“table1”,便于我我们待会再程序内对表格进行操作
三. 数据库中表格数据的加载
保存main.ui,返回Pycharm,在class Stats下补充类函数:
def add_cell(self,row,column,txt): #修改单个单元格的内容
item = QTableWidgetItem()
item.setText(txt)
self.ui.table1.setItem(row,column,item)
def init_table(self,tab_list):
self.row=int(len(tab_list))#获得行数
self.ui.table1.setRowCount(self.row) #初始化行数
for i in range(self.row):
temp = list(tab_list[i])
for j in range(5): #循环写入5个属性
self.add_cell(i,j,str(temp[j]))
结果如图所示:
这里类函数init_table需要输入含有每一行数据的列表作为参数,然后通过循环写入整个表的数据,因此我们需要先用SQL语句获取Student表的数据,找到下图else:所在的位置
在msgBox.about(stats.ui, '提示窗口', '数据库连接成功 ')后加入下述语句
###### 获得student表的全部内容 ######
cur = conn.cursor() #创建光标
cur.execute("select * from student;") #执行SQL指令
results = cur.fetchall()#获取所有结果
conn.commit()
###### 将数据写入UI ######
stats.init_table(results)
结果如下:
这里的conn和cur相当于全局变量,可以在类函数里面直接调用(后面会用到)
同时,创建了conn与cur,我们需要在程序结束时释放掉资源,所以我们要在关闭主窗口的类函数下加入这两句,cur.close()和conn.close()。如下图所示:
右键运行,可以看到,数据库student表中的所有数据均已显示在主窗口的表格中: