python3+PyQt5 数据库编程--增删改实例


Posted in Python onJune 17, 2019

本文通过python3+pyqt5改写实现了python Qt gui 编程变成15章的excise例子。

#!/usr/bin/env python3
import os
import sys
from PyQt5.QtCore import (QFile, QVariant, Qt)
from PyQt5.QtWidgets import (QApplication, QDialog, QDialogButtonBox, QMenu,
    QMessageBox, QTableView, QVBoxLayout)
from PyQt5.QtSql import (QSqlDatabase, QSqlQuery, QSqlTableModel)

MAC = True
try:
  from PyQt5.QtGui import qt_mac_set_native_menubar
except ImportError:
  MAC = False

ID, CATEGORY, SHORTDESC, LONGDESC = range(4)


class ReferenceDataDlg(QDialog):

  def __init__(self, parent=None):
    super(ReferenceDataDlg, self).__init__(parent)

    self.model = QSqlTableModel(self)
    self.model.setTable("reference")
    self.model.setSort(ID, Qt.AscendingOrder)
    self.model.setHeaderData(ID, Qt.Horizontal, "ID")
    self.model.setHeaderData(CATEGORY, Qt.Horizontal,"Category")
    self.model.setHeaderData(SHORTDESC, Qt.Horizontal,"Short Desc.")
    self.model.setHeaderData(LONGDESC, Qt.Horizontal,"Long Desc.")
    self.model.select()

    self.view = QTableView()
    self.view.setModel(self.model)
    self.view.setSelectionMode(QTableView.SingleSelection)
    self.view.setSelectionBehavior(QTableView.SelectRows)
    self.view.setColumnHidden(ID, True)
    self.view.resizeColumnsToContents()

    buttonBox = QDialogButtonBox()
    addButton = buttonBox.addButton("&Add",
        QDialogButtonBox.ActionRole)
    deleteButton = buttonBox.addButton("&Delete",
        QDialogButtonBox.ActionRole)
    sortButton = buttonBox.addButton("&Sort",
        QDialogButtonBox.ActionRole)
    if not MAC:
      addButton.setFocusPolicy(Qt.NoFocus)
      deleteButton.setFocusPolicy(Qt.NoFocus)
      sortButton.setFocusPolicy(Qt.NoFocus)

    menu = QMenu(self)
    sortByCategoryAction = menu.addAction("Sort by &Category")
    sortByDescriptionAction = menu.addAction("Sort by &Description")
    sortByIDAction = menu.addAction("Sort by &ID")
    sortButton.setMenu(menu)
    closeButton = buttonBox.addButton(QDialogButtonBox.Close)

    layout = QVBoxLayout()
    layout.addWidget(self.view)
    layout.addWidget(buttonBox)
    self.setLayout(layout)

    addButton.clicked.connect(self.addRecord)
    deleteButton.clicked.connect(self.deleteRecord)
    sortByCategoryAction.triggered.connect(lambda:self.sort(CATEGORY))
    sortByDescriptionAction.triggered.connect(lambda:self.sort(SHORTDESC))
    sortByIDAction.triggered.connect(lambda:self.sort(ID))
    closeButton.clicked.connect(self.accept)
    self.setWindowTitle("Reference Data")


  def addRecord(self):
    row = self.model.rowCount()
    self.model.insertRow(row)
    index = self.model.index(row, CATEGORY)
    self.view.setCurrentIndex(index)
    self.view.edit(index)


  def deleteRecord(self):
    index = self.view.currentIndex()
    if not index.isValid():
      return
    record = self.model.record(index.row())
    category = record.value(CATEGORY)
    desc = record.value(SHORTDESC)
    if (QMessageBox.question(self, "Reference Data",
        ("Delete {0} from category {1}?"
        .format(desc,category)),
        QMessageBox.Yes|QMessageBox.No) ==
        QMessageBox.No):
      return
    self.model.removeRow(index.row())
    self.model.submitAll()
    self.model.select()


  def sort(self, column):
    self.model.setSort(column, Qt.AscendingOrder)
    self.model.select()


def main():
  app = QApplication(sys.argv)

  filename = os.path.join(os.path.dirname(__file__), "reference.db")
  create = not QFile.exists(filename)

  db = QSqlDatabase.addDatabase("QSQLITE")
  db.setDatabaseName(filename)
  if not db.open():
    QMessageBox.warning(None, "Reference Data",
      "Database Error: {0}".format(db.lastError().text()))
    sys.exit(1)

  if create:
    query = QSqlQuery()
    query.exec_("""CREATE TABLE reference (
        id INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE NOT NULL,
        category VARCHAR(30) NOT NULL,
        shortdesc VARCHAR(20) NOT NULL,
        longdesc VARCHAR(80))""")

  form = ReferenceDataDlg()
  form.show()
  sys.exit(app.exec_())

main()

运行结果:

python3+PyQt5 数据库编程--增删改实例

以上这篇python3+PyQt5 数据库编程--增删改实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
python Django模板的使用方法(图文)
Nov 04 Python
举例讲解Python面相对象编程中对象的属性与类的方法
Jan 19 Python
python用reduce和map把字符串转为数字的方法
Dec 19 Python
TensorFlow实现卷积神经网络
May 24 Python
浅谈Pycharm中的Python Console与Terminal
Jan 17 Python
python opencv 图像拼接的实现方法
Jun 27 Python
Flask框架学习笔记之模板操作实例详解
Aug 15 Python
Python 自动登录淘宝并保存登录信息的方法
Sep 04 Python
Keras实现将两个模型连接到一起
May 23 Python
如何用python批量调整视频声音
Dec 22 Python
pycharm 的Structure界面设置操作
Feb 05 Python
Pytorch中使用ImageFolder读取数据集时忽略特定文件
Mar 23 Python
python3+PyQt5 创建多线程网络应用-TCP客户端和TCP服务器实例
Jun 17 #Python
python 应用之Pycharm 新建模板默认添加编码格式-作者-时间等信息【推荐】
Jun 17 #Python
python3+PyQt5 使用三种不同的简便项窗口部件显示数据的方法
Jun 17 #Python
对PyQt5中树结构的实现方法详解
Jun 17 #Python
PyQT实现菜单中的复制,全选和清空的功能的方法
Jun 17 #Python
使用python接入微信聊天机器人
Mar 31 #Python
基于树莓派的语音对话机器人
Jun 17 #Python
You might like
PHP闭包(Closure)使用详解
2013/05/02 PHP
jQuery+PHP+ajax实现微博加载更多内容列表功能
2014/06/27 PHP
PHP递归遍历多维数组实现无限分类的方法
2016/05/06 PHP
PHP中的self关键字详解
2019/06/23 PHP
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
JQuery 操作Javascript对象和数组的工具函数小结
2010/01/22 Javascript
js 居中漂浮广告
2010/03/21 Javascript
探讨js中的双感叹号判断
2013/11/11 Javascript
JavaScript实现防止网页被嵌入Frame框架的代码分享
2014/12/29 Javascript
jQuery中insertAfter()方法用法实例
2015/01/08 Javascript
JavaScript数据结构和算法之图和图算法
2015/02/11 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
BootStrap 动态表单效果
2017/06/02 Javascript
微信小程序网络请求实现过程解析
2019/11/06 Javascript
通过实例解析javascript Date对象属性及方法
2020/11/04 Javascript
python常用web框架简单性能测试结果分享(包含django、flask、bottle、tornado)
2014/08/25 Python
Python中使用摄像头实现简单的延时摄影技术
2015/03/27 Python
python类继承与子类实例初始化用法分析
2015/04/17 Python
Python实现简单的代理服务器
2015/07/25 Python
python 全文检索引擎详解
2017/04/25 Python
wxPython的安装图文教程(Windows)
2017/12/28 Python
Python中PyQt5/PySide2的按钮控件使用实例
2019/08/17 Python
Python 图像对比度增强的几种方法(小结)
2019/09/25 Python
python3实现语音转文字(语音识别)和文字转语音(语音合成)
2020/10/14 Python
在html页面中取得session中的值的方法
2020/08/11 HTML / CSS
微软英国官方网站:Microsoft英国
2016/10/15 全球购物
介绍一下ICMP(Internet Control Message Protocol)Internet控制信息协议
2016/11/26 面试题
销售人员职业生涯规划范文
2014/03/01 职场文书
应急处置方案
2014/06/16 职场文书
交通事故赔偿协议书怎么写
2014/10/04 职场文书
群众路线调研报告范文
2014/11/03 职场文书
2016年寒假见闻
2015/10/10 职场文书
护理专业毕业自我鉴定
2019/08/12 职场文书
《学会生存》读后感3篇
2019/12/09 职场文书
JS数组的常用方法整理
2021/03/31 Javascript
Node-Red实现MySQL数据库连接的方法
2021/08/07 MySQL