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采用requests库模拟登录和抓取数据的简单示例
Jul 05 Python
Python进程通信之匿名管道实例讲解
Apr 11 Python
更改Ubuntu默认python版本的两种方法python-> Anaconda
Dec 18 Python
Python贪心算法实例小结
Apr 22 Python
通过python顺序修改文件名字的方法
Jul 11 Python
pytorch中tensor的合并与截取方法
Jul 26 Python
python使用zip将list转为json的方法
Dec 31 Python
Python完全识别验证码自动登录实例详解
Nov 24 Python
python GUI库图形界面开发之PyQt5中QMainWindow, QWidget以及QDialog的区别和选择
Feb 26 Python
Python生成器常见问题及解决方案
Mar 21 Python
Python openpyxl 插入折线图实例
Apr 17 Python
python绘图subplots函数使用模板的示例代码
Apr 30 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缓存技术的多种方法小结
2012/08/14 PHP
laravel框架邮箱认证实现方法详解
2019/11/22 PHP
农历与西历对照
2006/09/06 Javascript
为Yahoo! UI Extensions Grid增加内置的可编辑器
2007/03/10 Javascript
Array栈方法和队列方法的特点说明
2014/01/24 Javascript
基于jquery实现放大镜效果
2015/08/17 Javascript
JavaScipt中栈的实现方法
2016/02/17 Javascript
理解javascript对象继承
2016/04/17 Javascript
使用Node.js实现RESTful API的示例
2017/08/01 Javascript
基于Vue2的独立构建与运行时构建的差别(详解)
2017/12/06 Javascript
vue 中的keep-alive实例代码
2018/07/20 Javascript
快速解决select2在bootstrap模态框中下拉框隐藏的问题
2018/08/10 Javascript
Nodejs实现用户注册功能
2019/04/14 NodeJs
VUE解决 v-html不能触发点击事件的问题
2019/10/28 Javascript
[01:55]2014DOTA2国际邀请赛 BBC正赛第一天总结
2014/07/10 DOTA
[01:03:42]VP vs VGJ.S 2018国际邀请赛小组赛BO2 第一场 8.19
2018/08/21 DOTA
python连接MySQL、MongoDB、Redis、memcache等数据库的方法
2013/11/15 Python
python读取和保存视频文件
2018/04/16 Python
python使用Flask操作mysql实现登录功能
2018/05/14 Python
详解python中Numpy的属性与创建矩阵
2018/09/10 Python
深入了解和应用Python 装饰器 @decorator
2019/04/02 Python
详解Python中import机制
2020/09/11 Python
用Python进行websocket接口测试
2020/10/16 Python
python给list排序的简单方法
2020/12/10 Python
使用CSS3制作一个简单的Chrome模拟器
2015/07/15 HTML / CSS
Java方面的关于数组和继承的笔面试题
2015/09/18 面试题
函数只定义了一次, 调用了一次, 但编译器提示非法重定义了-什么问题?
2014/10/03 面试题
开办饭店创业计划书
2013/12/28 职场文书
祖国在我心中演讲稿400字
2014/05/04 职场文书
cf战队收人口号
2014/06/21 职场文书
基层党建工作宣传标语
2014/06/24 职场文书
党的群众路线教育实践活动个人整改措施
2014/10/27 职场文书
平安建设汇报材料
2014/12/29 职场文书
python使用tkinter实现透明窗体上绘制随机出现的小球(实例代码)
2021/05/17 Python
Spring Boot实战解决高并发数据入库之 Redis 缓存+MySQL 批量入库问题
2022/02/12 Redis
Python利用zhdate模块实现农历日期处理
2022/03/31 Python