环境:

Python2.7+MySQL5.6+PyQt4

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

简单的图形化界面操作数据库:模仿写一个类似于navicat完毕可视化检索功能的界面,利用PyQt可视化编程高速完毕界面设计,这点比Tkinter设计要简单;

1.利用PyQt进行界面设计:

打开PyQt,新建,选择Main Window,选择左端的控件拖动完毕界面的设计,选中元素。能够从右側查看元素的信息以及改动其属性值,以下贴上设计图:



在设计界面中选中元素双击。能够改动其属性名。加入text。改变显示字符格式等;

2.设计完毕后,保存为.ui文件。接下来将其转换为.py文件:

打开cmd:进入PyQt安装文件夹:

Lib\site-packages\PyQt4\uic>

键入命令格式:

python pyuic.py -o .py文件文件夹+文件名称 .ui文件文件夹+文件名称



我保存的.ui文件放在D盘根文件夹中,生成的.py文件命名为nihao0.py

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">

3.打开Python执行.py,查看界面

在原有的代码基础上加入下列代码:

import sys

class MyWindow(QtGui.QMainWindow,Ui_MainWindow):#PyQt生产的是一个叫做Ui_MainWindow的类,仅仅须要放在一个框架下画出来就可以。
def __init__(self):
super(MyWindow,self).__init__()
self.setupUi(self) if __name__=="__main__":
app=QtGui.QApplication(sys.argv)#建立一个app,把框架放在这个app中执行
app.aboutToQuit.connect(app.deleteLater)
myshow=MyWindow()
myshow.show()
sys.exit(app.exec_())#也能够写成app.exec_() sys.exit(0),前者是循环整个界面,后者是退出app

执行结果:



这时我们得到了一个我们想得到的界面。仅仅须要往这个界面中加入各种事件就可以;

4.动态生成SQL语句——准备

新建数据库mysql。和表格students,表格的属性为

DDL为:

CREATE TABLE `students` (
`Sid` char(10) NOT NULL,
`Sname` char(10) DEFAULT NULL,
`Sage` int(3) DEFAULT NULL,
`Ssex` char(4) DEFAULT NULL,
`Sclass` char(7) DEFAULT NULL,
`Sdept` char(10) DEFAULT NULL,
`Saddr` char(40) DEFAULT NULL,
PRIMARY KEY (`Sid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

先写好句柄:

sqlsting="select * from students where "

然后写一个clicked()事件。点击查询的时候,依据用户输入动态构造SQL语句

使用到的方法主要有:

是否选择复选框:checked()

读入输入:text()

5.动态生成SQL语句——字符串构造

构造技巧:

是否须要加and:假设前面已经有了原子公式,须要添加and,否则不加。使用一个flag就可以;

是否须要加引號:字符型须要加引號,数字不须要加。

数字类型须要先转换为字符类型:当为数字类型转换为字符型str()。推断数据类型type(),事实上能够不写,由于从界面返回的都是QtString类型的数据。

推断什么时候使用Like(字符串匹配问题%):字符串方法.find("%")。返回值是第一个%出现的位置,假设%不存在。则返回-1;

6.界面显示问题

self.sql_out = QtGui.QTextBrowser(self.centralwidget):显示框用法:

.setText(str):清除原来数据。显示新的字符串

.append(str):在末尾加入新的字符串

self.result_out = QtGui.QTableWidget(self.centralwidget):表格框用法:

.setItem(i,j,newItem):将newItem放在第i行,第j列。注意ij都从0開始;

newItem的声明格式为newItem = QtGui.QTableWidgetItem(str),即在(i,j)位置显示str

注意QTableWidget仅仅能显示字符串,不能显示数字,全部在显示数据前,须要推断是否为数字:

解决方法:type()以及str()

7.数据库连接问题:

具体在Python&MySQL中已经讲述清除,能够作參考

8.贴上Python代码及执行结果:

# -*- coding: utf-8 -*-
# Form implementation generated from reading ui file 'D:/nihao.ui'
#
# Created: Fri Apr 01 15:28:59 2016
# by: PyQt4 UI code generator 4.11.3
#
# WARNING! All changes made in this file will be lost! from PyQt4 import QtCore, QtGui
import sys
import MySQLdb try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig) class Ui_MainWindow(object):
def setupUi(self, MainWindow): self.conn=MySQLdb.connect(
host='localhost',
user='root',
passwd='',
db='mysql',
#
charset='utf8',
)
self.cur=self.conn.cursor() self.sqlstring="select * from students where "
MainWindow.setObjectName(_fromUtf8("MainWindow"))
MainWindow.resize(760, 440)
self.centralwidget = QtGui.QWidget(MainWindow)
self.centralwidget.setObjectName(_fromUtf8("centralwidget"))
self.frame = QtGui.QFrame(self.centralwidget)
self.frame.setGeometry(QtCore.QRect(10, 10, 491, 121))
self.frame.setFrameShape(QtGui.QFrame.StyledPanel)
self.frame.setFrameShadow(QtGui.QFrame.Raised)
self.frame.setObjectName(_fromUtf8("frame"))
self.check_Sid = QtGui.QCheckBox(self.frame)
self.check_Sid.setGeometry(QtCore.QRect(20, 10, 71, 16))
self.check_Sid.setObjectName(_fromUtf8("check_Sid"))
self.check_Sage = QtGui.QCheckBox(self.frame)
self.check_Sage.setGeometry(QtCore.QRect(20, 70, 71, 16))
self.check_Sage.setObjectName(_fromUtf8("check_Sage"))
self.check_Sname = QtGui.QCheckBox(self.frame)
self.check_Sname.setGeometry(QtCore.QRect(20, 40, 71, 16))
self.check_Sname.setObjectName(_fromUtf8("check_Sname"))
self.check_Ssex = QtGui.QCheckBox(self.frame)
self.check_Ssex.setGeometry(QtCore.QRect(20, 100, 71, 16))
self.check_Ssex.setObjectName(_fromUtf8("check_Ssex"))
self.Sid = QtGui.QLineEdit(self.frame)
self.Sid.setGeometry(QtCore.QRect(90, 10, 113, 16))
self.Sid.setObjectName(_fromUtf8("Sid"))
self.Sname = QtGui.QLineEdit(self.frame)
self.Sname.setGeometry(QtCore.QRect(90, 40, 113, 16))
self.Sname.setObjectName(_fromUtf8("Sname"))
self.first_Sage = QtGui.QLineEdit(self.frame)
self.first_Sage.setGeometry(QtCore.QRect(90, 70, 41, 16))
self.first_Sage.setObjectName(_fromUtf8("first_Sage"))
self.Ssex = QtGui.QLineEdit(self.frame)
self.Ssex.setGeometry(QtCore.QRect(90, 100, 113, 16))
self.Ssex.setObjectName(_fromUtf8("Ssex"))
self.label = QtGui.QLabel(self.frame)
self.label.setGeometry(QtCore.QRect(140, 70, 16, 16))
self.label.setObjectName(_fromUtf8("label"))
self.last_Sage = QtGui.QLineEdit(self.frame)
self.last_Sage.setGeometry(QtCore.QRect(160, 70, 41, 16))
self.last_Sage.setObjectName(_fromUtf8("last_Sage"))
self.check_Sdept = QtGui.QCheckBox(self.frame)
self.check_Sdept.setGeometry(QtCore.QRect(270, 40, 71, 16))
self.check_Sdept.setObjectName(_fromUtf8("check_Sdept"))
self.Sdept = QtGui.QLineEdit(self.frame)
self.Sdept.setGeometry(QtCore.QRect(340, 40, 113, 16))
self.Sdept.setObjectName(_fromUtf8("Sdept"))
self.Sclass = QtGui.QLineEdit(self.frame)
self.Sclass.setGeometry(QtCore.QRect(340, 10, 113, 16))
self.Sclass.setObjectName(_fromUtf8("Sclass"))
self.check_Sclass = QtGui.QCheckBox(self.frame)
self.check_Sclass.setGeometry(QtCore.QRect(270, 10, 71, 16))
self.check_Sclass.setObjectName(_fromUtf8("check_Sclass"))
self.Saddr = QtGui.QLineEdit(self.frame)
self.Saddr.setGeometry(QtCore.QRect(340, 70, 113, 16))
self.Saddr.setObjectName(_fromUtf8("Saddr"))
self.check_Saddr = QtGui.QCheckBox(self.frame)
self.check_Saddr.setGeometry(QtCore.QRect(270, 70, 71, 16))
self.check_Saddr.setObjectName(_fromUtf8("check_Saddr"))
self.find = QtGui.QPushButton(self.frame)
self.find.setGeometry(QtCore.QRect(380, 100, 75, 21))
self.find.setObjectName(_fromUtf8("find"))
self.sql_out = QtGui.QTextBrowser(self.centralwidget)
self.sql_out.setGeometry(QtCore.QRect(10, 140, 740, 61))
self.sql_out.setObjectName(_fromUtf8("sql_out"))
self.result_out = QtGui.QTableWidget(self.centralwidget)
self.result_out.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)#不可编辑表格
self.result_out.setGeometry(QtCore.QRect(10, 210, 740, 171))
self.result_out.setObjectName(_fromUtf8("result_out"))
self.result_out.setColumnCount(7)
self.result_out.setRowCount(10)
self.result_out.resizeColumnsToContents()
self.result_out.resizeRowsToContents()
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(0, item)
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(1, item)
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(2, item)
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(3, item)
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(4, item)
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(5, item)
item = QtGui.QTableWidgetItem()
self.result_out.setHorizontalHeaderItem(6, item)
self.result_out.horizontalHeader().setDefaultSectionSize(100)
self.result_out.horizontalHeader().setMinimumSectionSize(25)
self.result_out.verticalHeader().setDefaultSectionSize(30)
self.pushButton_2 = QtGui.QPushButton(self.centralwidget)
self.pushButton_2.setGeometry(QtCore.QRect(675, 390, 75, 21))
self.pushButton_2.setObjectName(_fromUtf8("pushButton_2"))
MainWindow.setCentralWidget(self.centralwidget)
self.menubar = QtGui.QMenuBar(MainWindow)
self.menubar.setGeometry(QtCore.QRect(0, 0, 509, 23))
self.menubar.setObjectName(_fromUtf8("menubar"))
MainWindow.setMenuBar(self.menubar)
self.statusbar = QtGui.QStatusBar(MainWindow)
self.statusbar.setObjectName(_fromUtf8("statusbar"))
MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow)
QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow):
MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow", None))
self.check_Sid.setText(_translate("MainWindow", "学号", None))
self.check_Sage.setText(_translate("MainWindow", "年龄自", None))
self.check_Sname.setText(_translate("MainWindow", "姓名", None))
self.check_Ssex.setText(_translate("MainWindow", "性别", None))
self.label.setText(_translate("MainWindow", "到", None))
self.check_Sdept.setText(_translate("MainWindow", "系", None))
self.check_Sclass.setText(_translate("MainWindow", "班级", None))
self.check_Saddr.setText(_translate("MainWindow", "地址", None))
self.find.setText(_translate("MainWindow", "查询", None))
self.sql_out.setText(self.sqlstring)
item = self.result_out.horizontalHeaderItem(0)
item.setText(_translate("MainWindow", "Sid", None))
item = self.result_out.horizontalHeaderItem(1)
item.setText(_translate("MainWindow", "Sname ", None))
item = self.result_out.horizontalHeaderItem(2)
item.setText(_translate("MainWindow", "Sage", None))
item = self.result_out.horizontalHeaderItem(3)
item.setText(_translate("MainWindow", "Ssex", None))
item = self.result_out.horizontalHeaderItem(4)
item.setText(_translate("MainWindow", "Sclass", None))
item = self.result_out.horizontalHeaderItem(5)
item.setText(_translate("MainWindow", "Sdept", None))
item = self.result_out.horizontalHeaderItem(6)
item.setText(_translate("MainWindow", "Saddr", None))
self.pushButton_2.setText(_translate("MainWindow", "退出", None))
def mousePressEvent(self,event):
if event.self.find()==QtCore.Qt.LeftButton:
print "nihao" def buttonTest(self):
temp_sqlstring=self.sqlstring
is_first = True
if self.check_Sid.isChecked():
mystr = self.Sid.text()
if is_first:
is_first = False
if mystr.find("%")==-1:
temp_sqlstring += "Sid = '" + self.Sid.text() + "'"
else:
temp_sqlstring += "Sid like '" + self.Sid.text() + "'"
else:
if mystr.find("%")==-1:
temp_sqlstring += " and Sid = '" + self.Sid.text() + "'"
else:
temp_sqlstring += " and Sid like '" + self.Sid.text() + "'" if self.check_Sname.isChecked():
if is_first:
mystr =self.Sname.text()
is_first = False
if mystr.find("%")==-1:
temp_sqlstring += "Sname = '" + self.Sname.text() + "'"
else:
temp_sqlstring += "Sname like '" + self.Sname.text() + "'"
else:
if mystr.find("%")==-1:
temp_sqlstring += " and Sname = '" + self.Sname.text() + "'"
else:
temp_sqlstring += " and Sname like '" + self.Sname.text() + "'" if self.check_Sage.isChecked():
if is_first:
is_first = False
temp_sqlstring += "Sage >= " + self.first_Sage.text() +\
" and Sage <= " + self.last_Sage.text()
else:
temp_sqlstring += " and Sage >= " + self.first_Sage.text() +\
" and Sage <= " + self.last_Sage.text() if self.check_Ssex.isChecked():
if is_first:
is_first = False
temp_sqlstring += "Ssex = '" + self.Ssex.text() + "'"
else:
temp_sqlstring += " and Ssex = '" + self.Ssex.text() + "'" if self.check_Sclass.isChecked():
if is_first:
mystr = self.Sclass.text()
is_first = False
if mystr.find("%")==-1:
temp_sqlstring += "Sclass = '" + self.Sclass.text() + "'"
else:
temp_sqlstring += "Sclass like '" + self.Sclass.text() + "'"
else:
if mystr.find("%")==-1:
temp_sqlstring += " and Sclass = '" + self.Sclass.text() + "'"
else:
temp_sqlstring += " and Sclass like '" + self.Sclass.text() + "'" if self.check_Sdept.isChecked():
if is_first:
mystr = self.Sdept.text()
is_first = False
if mystr.find("%")==-1:
temp_sqlstring += "Sdept = '" + self.Sdept.text() + "'"
else:
temp_sqlstring += "Sdept like '" + self.Sdept.text() + "'"
else:
if mystr.find("%")==-1:
temp_sqlstring += " and Sdept = '" + self.Sdept.text() + "'"
else:
temp_sqlstring += " and Sdept like '" + self.Sdept.text() + "'" if self.check_Saddr.isChecked():
if is_first:
mystr = self.Saddr.text()
is_first = False
if mystr.find("%")==-1:
temp_sqlstring += "Saddr = '" + self.Saddr.text() + "'"
else:
temp_sqlstring +=" and Saddr like '" + self.Saddr.text() + "'"
else:
if mystr.find("%")==-1:
temp_sqlstring += " and Saddr = '" + self.Saddr.text() + "'"
else:
temp_sqlstring +=" and Saddr like '" + self.Saddr.text() + "'" self.result_out.clearContents()#每一次查询时清除表格中信息
if not(is_first):
self.cur.execute(temp_sqlstring)
k=0
for i in self.cur:
w=0
for j in i:
if type(j)==long:
newItem = QtGui.QTableWidgetItem(str(j))
else:
newItem = QtGui.QTableWidgetItem(j)
self.result_out.setItem(k,w,newItem)
w += 1
k +=1 self.sql_out.setText("")
self.sql_out.append(temp_sqlstring)
print "find button pressed" def buttonExit(self):
self.conn.commit()
self.cur.close()
self.conn.close()
self.close() def keyPressEvent(self, e):
if e.key() == QtCore.Qt.Key_Escape:
self.buttonExit() class MyWindow(QtGui.QMainWindow,Ui_MainWindow):
def __init__(self):
super(MyWindow,self).__init__()
self.setupUi(self)
self.connect(self.find, QtCore.SIGNAL('clicked()'), self.buttonTest)
self.connect(self.pushButton_2,QtCore.SIGNAL('clicked()'),self.buttonExit) if __name__=="__main__":
app=QtGui.QApplication(sys.argv)
app.aboutToQuit.connect(app.deleteLater)
myshow=MyWindow()
myshow.show()
sys.exit(app.exec_())
#app.exec_()
#sys.exit(0)

注:执行前首先确保已经在MySQL中存在mysql数据库以及students表格。

执行结果:



因为原来设计的界面比較小。后来改变了各个控件的长宽;

这样就完毕的简单的界面化动态构造SQL语句,并将结果返回界面显示功能。

Python&amp;MySQL&amp;PyQt的更多相关文章

  1. 【初学python】使用python连接mysql数据查询结果并显示

    因为测试工作经常需要与后台数据库进行数据比较和统计,所以采用python编写连接数据库脚本方便测试,提高工作效率,脚本如下(python连接mysql需要引入第三方库MySQLdb,百度下载安装) # ...

  2. Python(九) Python 操作 MySQL 之 pysql 与 SQLAchemy

    本文针对 Python 操作 MySQL 主要使用的两种方式讲解: 原生模块 pymsql ORM框架 SQLAchemy 本章内容: pymsql 执行 sql 增\删\改\查 语句 pymsql ...

  3. 使用 python 管理 mysql 开发工具箱 - 1

    Mysql 是一个比较优秀的开源的数据库,很多公司都在使用.作为运维人员,经常做着一些重复性的工作,比如创建数据库实例,数据库备份等,完全都可以使用 python 编写一个工具来实现. 一.模块 Co ...

  4. 练习:python 操作Mysql 实现登录验证 用户权限管理

    python 操作Mysql 实现登录验证 用户权限管理

  5. Python操作MySQL

    本篇对于Python操作MySQL主要使用两种方式: 原生模块 pymsql ORM框架 SQLAchemy pymsql pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb ...

  6. Python操作Mysql数据库时SQL语句的格式问题

    一.概述 近日使用Python对Mysql数据库进行操作,遇到SQL语句死活出问题的情况.由于最初没有将异常打印出来,一直不知道原因.随后,将异常打印出来之后,通过异常信息,对代码进行修改.最终,成功 ...

  7. Python操作Mysql之基本操作

    pymysql python操作mysql依赖pymysql这个模块 下载安装 pip3 install pymysql 操作mysql python操作mysql的时候,是通过”游标”来进行操作的. ...

  8. python对Mysql操作和使用ORM框架(SQLAlchemy)

    python对mysql的操作 Mysql 常见操作 数据库操作 创建数据库 create database fuzjtest 删除数据库 drop database fuzjtest 查询数据库 s ...

  9. python操作mysql总结

    Windows系统,python环境搭建. 下载并安装python2.7.11 https://www.python.org/downloads/ 下载并安装python的mysql包: http:/ ...

随机推荐

  1. javascript中的变量、作用域和内存问题

    1.变量 变量的值的类型:基本类型值和引用类型值两种. 基本类型:Undefined.Null.Boolean.String.Number,这五类基本数据类型的值在内存中占有固定大小的空间,因此保存在 ...

  2. geolocation h5

    navigator. geolocation.getCurrentPosition() 触发浏览器弹窗询问用户同意访问地址.接收三个参数:成功回调函数,可选的失败回调,可选选项对象   成功回调函数接 ...

  3. 提取URL的搜索字符串中的参数

    function urlArgs(){ var args = {}; var query = location.search.substring(1); if(query){ if(query.ind ...

  4. Github从注册到上传本地项目详解!!!

    由于本人对于git并不是很熟悉,所以能从一个初学者或者说是未知者的角度去给大家解释每一步的操作. 另外如果本文不够详细的话,请参考 廖雪峰git教程  偷偷有码git从入门到上传本地项目 那么开始! ...

  5. nova创建虚拟机源码分析系列之七 传入参数转换成内部id

    上一篇博文将nova创建虚机的流程推进到了/compute/api.py中的create()函数,接下来就继续分析. 在分析之前简单介绍nova组件源码的架构.以conductor组件为例: 每个组件 ...

  6. The Speed 歌词

    [ti:]The Speed [ar:]<QQ飞车> [al:]幻想 [by:]伴奏:My Soul   [00:03.60]The Speed [00:07.06]<QQ飞车> ...

  7. 基于gitHub+hexo搭建的个人博客

    文章导航 前期准备 安装hexo 修改hexo主题 自定义主题 部署本地文件到github查看 我的第一篇博客 前期准备 下载安装git命令行工具.node及npm环境 注册自己的GitHub账号 安 ...

  8. distcc (dcc_execvp) ERROR: failed to exec XX: Permission denied

    首先先确保一下是不是能执行下面语句: # sudo -u nobody XX --version 如果能看见版本信息,则可以不用往下看. 再检查一下distccd.service # sudo cat ...

  9. C#的Main(String[] args)参数输入问题

    1.新建一个控制台应用程序,保存在桌面上,Main函数如下所示 using System;using System.Collections.Generic;using System.Linq;usin ...

  10. [转]开源框架完美组合之Spring.NET + NHibernate + ASP.NET MVC + jQuery + easyUI 中英文双语言小型企业网站Demo

    热衷于开源框架探索的我发现ASP.NET MVC与jQuery easyUI的组合很给力.由于原先一直受Ext JS框架的licence所苦恼,于是痛下决心寻找一个完全免费的js框架——easyUI. ...