广告位联系
返回顶部
分享到

Python+PyQt5实现数据库表格动态增删改

python 来源:互联网 作者:秩名 发布时间:2022-03-01 16:35:38 人浏览
摘要

题目描述 本次实验为连接数据库的实验,并对数据库进行一些简单的操作,要实现的基本功能如下所示,要能连接并展现数据库里的数据,能够实现插入功能。 拓展; 实现按学号查找学

题目描述

本次实验为连接数据库的实验,并对数据库进行一些简单的操作,要实现的基本功能如下所示,要能连接并展现数据库里的数据,能够实现插入功能。

拓展;

  • 实现按学号查找学生信息功能
  • 实现清空数据功能
  • 实现保存数据功能
  • 实现右键菜单功能

解题思路/算法分析/问题及解决

本次实验可主要分为两个部分,即数据库连接操作部分和数据可视化操作界面部分。

数据库连接部分采用python的pymysql库对数据库进行连接操作。

数据可视化部分采用tableWidget控件进行表格化的呈现,并通过相应的控件交互来实现功能。TableWidget的主要方法如下表所示:

实验代码

数据库连接

1

2

3

4

5

6

def db_connect(self):

        self.db = pymysql.connect(host='localhost',

                             user='root',

                             password='Zwq197166',

                             port=3306,

                             database='test')

可视化界面操作部分

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

80

81

82

83

84

85

86

87

88

89

90

91

92

93

94

95

96

97

98

99

100

101

102

103

104

105

106

107

108

109

110

111

112

113

114

115

116

117

118

119

120

121

122

123

124

125

126

127

128

129

130

131

132

133

134

135

136

137

138

139

140

141

142

143

144

145

146

147

148

149

150

151

152

153

154

155

156

157

158

159

160

161

162

163

164

165

166

167

168

169

170

171

172

173

174

175

176

177

178

179

180

181

182

183

184

185

186

187

188

189

190

191

192

193

194

195

196

197

198

199

200

201

202

203

204

205

206

207

208

209

210

211

212

213

214

215

216

217

218

219

220

221

222

223

224

225

226

227

228

229

230

231

232

233

234

235

236

237

238

239

240

241

def inser_row(self, row, sid, name, sex, address):

        sid_item = QTableWidgetItem(sid)

        name_item = QTableWidgetItem(name)

        sex_item = QTableWidgetItem(sex)

        address_item = QTableWidgetItem(address)

        self.tableWidget.insertRow(row)

        self.tableWidget.setItem(row, 0, sid_item)

        self.tableWidget.setItem(row, 1, name_item)

        self.tableWidget.setItem(row, 2, sex_item)

        self.tableWidget.setItem(row, 3, address_item)

 

    @pyqtSlot()

    def on_button_load_clicked(self):

        if self.button_save.isEnabled():

            r = QMessageBox.warning(self, "警告", "是否覆盖当前表格数据", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

            if r == QMessageBox.No:

                return

        self.tableWidget.setRowCount(0)

        self.tableWidget.clearContents()

        self.db_connect()

        cursor = self.db.cursor()

        sql = "select * from my_student;"

        try:

            cursor.execute(sql)

            results = cursor.fetchall()

            for (sid, name, sex,address) in results:

                print(sid, name, sex, address)

                row = self.tableWidget.rowCount()

                # print(row)

                self.inser_row(row, sid, name, sex, address)

                data[sid] = [name, sex, address]

        except:

            print("unable to fetch data")

 

        self.db.close()

        self.button_save.setEnabled(True)

        print("load")

 

    @pyqtSlot()

    def on_button_add_clicked(self):

        di = inputDialog()

        ok = di.exec_()

        if not ok:

            return

        name = di.line_name.text()

        sid = di.line_id.text()

        sex = di.line_sex.text()

        address = di.line_address.text()

        print(name,sid)

        print(type(address))

        data[sid] = [name, sex, address]

        self.inser_row(self.tableWidget.rowCount(), sid, name, sex, address)

        print(data)

        print("add")

        # self.tableWidget.insertRow(self.tableWidget.rowCount()-1)

        self.button_save.setEnabled(True)

 

 

    @pyqtSlot()

    def on_button_save_clicked(self):

        print(data)

        self.db_connect()

        cursor = self.db.cursor()

        try:

            sql = "delete from my_student;"

            cursor.execute(sql)

            # self.db.commit()

            for key, value in data.items():

                sql = "insert into my_student(sid,name,sex,address) values('{sid}','{name}','{sex}','{address}');".format(sid=key, name=value[0], sex=value[1], address=value[2])

                print(sql)

                cursor.execute(sql)

            self.db.commit()

            self.db.close()

            print("save")

            self.button_save.setEnabled(False)

        except:

            QMessageBox.critical(self, "错误", "数据格式有误,请检查")

 

 

    @pyqtSlot()

    def on_button_clear_clicked(self):

        self.tableWidget.setRowCount(0)

        self.tableWidget.clearContents()

        data.clear()

        self.line_id.clear()

        self.button_save.setEnabled(True)

 

    @pyqtSlot()

    def on_button_search_clicked(self):

        sid = self.line_id.text()

        if not sid:

            QMessageBox.critical(self, "警告", "请输入一个学号!")

            return

        print(sid)

        if sid in data:

            search = INFO(sid)

            search.exec_()

            # print("search")

        else:

            QMessageBox.critical(self, "错误", "该学号不存在!")

 

 

    @pyqtSlot(QTableWidgetItem)

    def on_tableWidget_itemActivated(self, item):

        """

        按住Enter键时,当前选中的单元格向下

        """

        row = self.tableWidget.row(item)

        column = self.tableWidget.column(item)

        totalrow = self.tableWidget.rowCount()

 

        if row + 1 < totalrow:

            row = self.tableWidget.row(item) + 1

            self.tableWidget.setCurrentCell(row, column)

        elif row + 2 == totalrow:

            row = totalrow - 1

            self.tableWidget.setCurrentCell(row, column)

 

    @pyqtSlot(int, int)

    def on_tableWidget_cellDoubleClicked(self, row, column):

        id = self.tableWidget.item(row, 0).text()

        di = inputDialog(sid=id)

        ok = di.exec_()

        if not ok:

            return

        name = di.line_name.text()

        sid = di.line_id.text()

        sex = di.line_sex.text()

        address = di.line_address.text()

        print("before:", id)

        print("after:", sid)

        self.tableWidget.item(row, 0).setText(sid)

        self.tableWidget.item(row, 1).setText(name)

        self.tableWidget.item(row, 2).setText(sex)

        self.tableWidget.item(row, 3).setText(address)

        data[sid] = [name, sex, address]

        if id != sid:

            del data[id]

        self.button_save.setEnabled(True)

 

 

    def closeEvent(self, event):

        if self.button_save.isEnabled():

            r = QMessageBox.warning(self, "警告", "你还有操作没保存,现在保存下?", QMessageBox.Yes | QMessageBox.No, QMessageBox.Yes)

            if r == QMessageBox.No:

                event.accept()

            else:

                event.ignore()

 

    def context_menu(self,pos):

        pop_menu = QMenu()

        change_new_event = pop_menu.addAction("修改行")

        delete_event = pop_menu.addAction("删除行")

        action = pop_menu.exec_(self.tableWidget.mapToGlobal(pos))

 

        if action == change_new_event:

            item = self.tableWidget.selectedItems()

            row = item[0].row()

            id = self.tableWidget.item(row, 0).text()

            di = inputDialog(sid=id)

            ok = di.exec_()

            if not ok:

                return

            name = di.line_name.text()

            sid = di.line_id.text()

            sex = di.line_sex.text()

            address = di.line_address.text()

            print("before:",id)

            print("after:",sid)

            self.tableWidget.item(row, 0).setText(sid)

            self.tableWidget.item(row, 1).setText(name)

            self.tableWidget.item(row, 2).setText(sex)

            self.tableWidget.item(row, 3).setText(address)

            data[sid] = [name, sex, address]

            if id != sid:

                del data[id]

            self.button_save.setEnabled(True)

        elif action == delete_event:

            r = QMessageBox.warning(self, "注意", "删除可不能恢复了哦!", QMessageBox.Yes | QMessageBox.No, QMessageBox.No)

            if r == QMessageBox.No:

                return

            items = self.tableWidget.selectedItems()

            if items:

                selected_rows = []

                for i in items:

                    row = i.row()

                    if row not in selected_rows:

                        selected_rows.append(row)

                selected_rows = sorted(selected_rows, reverse=True)

                for r in selected_rows:

                    sid = self.tableWidget.item(r, 0).text()

                    del data[sid]

                    self.tableWidget.removeRow(r)

            self.button_save.setEnabled(True)

 

class inputDialog(QDialog, Ui_Dialog_input):

    def __init__(self, sid=None):

        super(inputDialog, self).__init__()

        self.setupUi(self)

        self.sid = sid

        self.buttonBox.accepted.connect(self.check)

 

        if sid:

            self.line_id.setText(sid)

            self.line_name.setText(data[sid][0])

            self.line_sex.setText(data[sid][1])

            self.line_address.setText(data[sid][2])

 

 

    def check(self):

        sid = self.line_id.text()

        name = self.line_name.text()

        if sid in data and self.sid not in data:

            r = QMessageBox.warning(self, "警告", "该学号已存在!", QMessageBox.Ok)

            return

 

        if not sid:

            r = QMessageBox.warning(self, "警告", "学号为必填项!", QMessageBox.Ok)

            return

 

        if not name:

            r = QMessageBox.warning(self, "警告", "姓名为必填项!", QMessageBox.Ok)

            return

 

        self.accept()

        # print('miss')

 

 

class INFO(QDialog, Ui_Dialog_info):

    def __init__(self, id: str):

        super(INFO, self).__init__()

        self.setupUi(self)

        self.line_id.setText(id)

        self.line_name.setText(data[id][0])

        self.line_sex.setText(data[id][1])

        self.line_address.setText(data[id][2])

 

    @pyqtSlot()

    def on_button_confirm_clicked(self):

        # print(1)

        self.close()

运行结果

Python客栈送红包、纸质书

导入数据:

添加数据:

清空数据:

搜索数据:

修改数据:

双击修改

右键菜单修改:

删除后:

保存数据:


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 : https://blog.csdn.net/weixin_45816954/article/details/123172747
相关文章
  • Python Django教程之实现新闻应用程序

    Python Django教程之实现新闻应用程序
    Django是一个用Python编写的高级框架,它允许我们创建服务器端Web应用程序。在本文中,我们将了解如何使用Django创建新闻应用程序。 我们将
  • 书写Python代码的一种更优雅方式(推荐!)

    书写Python代码的一种更优雅方式(推荐!)
    一些比较熟悉pandas的读者朋友应该经常会使用query()、eval()、pipe()、assign()等pandas的常用方法,书写可读性很高的「链式」数据分析处理代码
  • Python灰度变换中伽马变换分析实现

    Python灰度变换中伽马变换分析实现
    1. 介绍 伽马变换主要目的是对比度拉伸,将图像灰度较低的部分进行修正 伽马变换针对的是对单个像素点的变换,也就是点对点的映射 形
  • 使用OpenCV实现迷宫解密的全过程

    使用OpenCV实现迷宫解密的全过程
    一、你能自己走出迷宫吗? 如下图所示,可以看到是一张较为复杂的迷宫图,相信也有人尝试过自己一点一点的找出口,但我们肉眼来解谜
  • Python中的数据精度问题的介绍

    Python中的数据精度问题的介绍
    一、python运算时精度问题 1.运行时精度问题 在Python中(其他语言中也存在这个问题,这是计算机采用二进制导致的),有时候由于二进制和
  • Python随机值生成的常用方法

    Python随机值生成的常用方法
    一、随机整数 1.包含上下限:[a, b] 1 2 3 4 import random #1、随机整数:包含上下限:[a, b] for i in range(10): print(random.randint(0,5),end= | ) 查看运行结
  • Python字典高级用法深入分析讲解
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python浅析多态与鸭子类型使用实例
    什么多态:同一事物有多种形态 为何要有多态=》多态会带来什么样的特性,多态性 多态性指的是可以在不考虑对象具体类型的情况下而直
  • Python字典高级用法深入分析介绍
    一、 collections 中 defaultdict 的使用 1.字典的键映射多个值 将下面的列表转成字典 l = [(a,2),(b,3),(a,1),(b,4),(a,3),(a,1),(b,3)] 一个字典就是一个键对
  • Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本

    Python淘宝或京东等秒杀抢购脚本实现(秒杀脚本
    我们的目标是秒杀淘宝或京东等的订单,这里面有几个关键点,首先需要登录淘宝或京东,其次你需要准备好订单,最后要在指定时间快速
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计