python
主页 > 脚本 > python >

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

2022-03-01 | 秩名 | 点击:

题目描述

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

拓展;

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

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

数据库连接部分采用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客栈送红包、纸质书

导入数据:

添加数据:

清空数据:

搜索数据:

修改数据:

双击修改

右键菜单修改:

删除后:

保存数据:

原文链接:https://blog.csdn.net/weixin_45816954/article/details/123172747
相关文章
最新更新