一个小错误
pycharm中自动添加文件的信息的设置从
setting->Editor->file and Templates中如果这里面的模板错误,将无法建立python文件
python操作数据库
1.导入包
import pymysql
如果没有的话从cmd
pip install pymysql
2.连接数据库
db = pymysql.connect("localhost", "root", "1230", "javabook")
前两个可以认为默认,第三个是密码,第四个是你自己建立的数据库
3.创建游标
cursor = db.cursor
4.执行sql语句
(1)查询操作
cursor.execute()
[]= cursor.fetchone()
*这里面有三个函数可以使用
函数 | 含义 |
---|---|
fetchone() | 获取一个 |
fetchall() | 获取全部 |
fetchmany() | (里面有参数数字)获取多个 |
(2)增加操作
cursor.execute("insert into [tablename](columns) values (%s)%("")")
(3)删除
cursor.excute("delete from 表名 where (条件)")
5.关闭游标以及断开数据库
cursor.close()
db.close()
python中sql有大坑
1.sql语句的占位符问题
如果用%s转化成字符串输出看起来是没错的
,但是这个sql应该是能直接被cmd使用的sql才能被执行,很明显上面的字符串"beijing",“2017/1/2"是很明显不能被识别的,so,一直会报错"beijing is not find columns”;
正确的应该
类似于这种的sql语句,那么该怎么写呢?如下,只要在占位符号上加上"",(或者’’,根据你自己的最外层引号情况而定)
sql = 'insert into chengdu(site,date,year,month,day,hour,value) values("%s","%s",%s,%s,%s,%s,%s)'%(site,date,year,month,date,hour,value)
应用:制作一个空气质量检测的系统
1.功能以及实现
功能 | 实现 |
---|---|
用户注册登陆 | 数据库增加查找 |
空气质量查看 | 数据库查找 |
数据的可视化 | python引入数据管理 |
权限管理 | 界面的显示不同,类似视图 |
管理员管理空气质量 | 数据库的增删查改 |
管理管理用户实现删除以及权限赋予 | 数据库的增删修改 |
数据库数据的安全 | 日志的使用(其实可以加上事务,每天检查删除修改) |
用户界面以及管理员界面 | tk以及wx等python可视化工具类库 |
快速查询 | 建立四张表,实现索引 |
2.具体实现
(1)持久层
1.直接使用navicat导入空气的质量,引入五张张表,实现索引。
2.创建用户表
create table user(
name varchar(30),
id int primary key,
address(30),
role varchar(5)
);
3.创建日志表
create table log(
date Date,
id int primarty key,
userId int,
operater varchar(30),
foreign key(userId = user.id)
);
(2)后台实现
1.空气质量的查找
(1)实现
注:还需要实现选择图像的功能在查找这里
siteSelect = {"北京":"beijign","上海":"shanghai","沈阳":"shengyang","广州":"guangzhou","成都":"chengdu"}#索引功能的实现
tableName = siteSelect[site]
if site and year and month and day and hour:#直接查询
sql = "select Site,Parameter,Date,Value,Unit,Duration,QCName from %s where Year=%s and Month=%s and Day=%s and Hour=%s" % (
tableName, year, month, day, hour)#表明可能会错,错了就在第一个%s上加上单引号
self.Cout.setValue("")
allvalue(self, sql)
elif site and year and month and day and not hour:#一天的状况
self.COut.SetValue("")
#mysql3(site, year, month, day)
data = mysql2(site, year, month, day)
draw_trend_chart(data,site,str(year)+"年"+str(month)+"月"+str(day) +"号")
elif not site and year and month and day and not hour:#一个月的状况(使用1点的平均值)
draw_trend_chart2(year,month,day)
else:
self.COut.SetValue("")
data = mysql3(site, year, month)
draw_trend_chart(data,site,str(year)+"年"+str(month) + "月(每日平均值)")
(2)图像的可视化
#一天的图像
def mysql2(site,year,month,day):
db = pymysql.connect(host="localhost", user="root", password="123", database="homework")
# 用cursor创建一个游标对象cursor
cursor = db.cursor()
siteSelect = {"北京": "beijign", "上海": "shanghai", "沈阳": "shengyang", "广州": "guangzhou", "成都": "chengdu"} # 索引功能的实现
tableName = siteSelect[site]
sql = 'select Value,Hour from ' + tableName + " where Year=%s and Month=%s and Day=%s" % (year,month,day)
cursor.execute(sql)
result = cursor.fetchmany(24)
Time = []
Value = []
for i in result:
Time.append(i[1])
Value.append(i[0])
# 关闭数据库
cursor.close()
db.close()
return [Time,Value]
############################################################################
#一个月的图像(平均值)
def mysql3(site,year,month):
db = pymysql.connect(host="localhost", user="root", password="123", database="homework")
# 用cursor创建一个游标对象cursor
cursor = db.cursor()
siteSelect = {"北京": "beijign", "上海": "shanghai", "沈阳": "shengyang", "广州": "guangzhou", "成都": "chengdu"} # 索引功能的实现
tableName = siteSelect[site]
str1 = "select Value,Day from "+ tableName + " where Year=%s and Month=%s" % (year, month)
cursor.execute(str1)
result = cursor.fetchall()
Value = []
Time = []
for i in result:
Time.append(i[1])
Value.append(i[0])
# 关闭数据库
cursor.close()
db.close()
Value2 = []
Time2 = []
j = Time[0]
#计算平均值
sum = 0
cnt = 0
index = 0
Time2.append(Time[0])
for i in Time:
if i == j:
sum += int(Value[index])
cnt += 1
index+=1
else :
Value2.append(sum/cnt)
Time2.append(i)
j = i
cnt = 0
sum = 0
Value2.append(sum/cnt)
return [Time2,Value2]
##########################################################################
def draw_trend_chart(data,site,value):
x = data[0]
y = data[1]
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.figure()
plt.plot(x, y, "r", linewidth=2)
plt.title( site + "PM2.5" + value+"状况") # 标题
plt.savefig("图片") # 保存图片名称
lena = mping.imread('图片.png') # 读取图片文件信息
lena.shape
plt.title(site + value + " PM2.5"+"状况")
plt.show()
#############################################################################
def draw_trend_chart2(year,month,day):
data1 = mysql2("北京",year,month,day)
data2 = mysql2("上海",year,month,day)
data3 = mysql2("成都",year,month,day)
data4 = mysql2("沈阳",year,month,day)
data5 = mysql2("广州",year,month,day)
x = data1[0]
y = data1[1]
mpl.rcParams['font.sans-serif'] = ['SimHei'] # 指定默认字体
mpl.rcParams['axes.unicode_minus'] = False # 解决保存图像是负号'-'显示为方块的问题
plt.figure()
plt.plot(x, y, "r", linewidth=2,label = "北京")
x = data2[0]
y = data2[1]
plt.plot(x, y, "green", linewidth=2,label = "上海")
x = data3[0]
y = data3[1]
plt.plot(x, y, "black", linewidth=2,label = "广州")
x = data4[0]
y = data4[1]
plt.plot(x, y, "yellow", linewidth=2,label = "成都")
x = data5[0]
y = data5[1]
plt.plot(x, y, "blue", linewidth=2,label = "沈阳")
plt.legend(bbox_to_anchor=(0., 1.02, 1., .130), loc=0,
ncol=3, mode="expand", borderaxespad=0.)
plt.savefig("图片") # 保存图片名称
lena = mping.imread('图片.png') # 读取图片文件信息
lena.shape
plt.ylabel("PM2.5 微克\\立方米")
plt.xlabel("时间 \\ 小时")
plt.show()
(3)数据库连接
def allvalue(self,sql1):
db = pymysql.connect("localhost", "root", "123", "homework")
cursor = db.cursor()
#创建一个cursor对象,帮助我们执行sql语句
cursor.execute(sql1)
reslist = cursor.fetchone()
if reslist:
for item in reslist:
self.COut.AppendText(str(item)+' ')
else:
self.COut.AppendText('时间输入错误')
cursor.close()
db.close()
(3)用户的登陆注册功能
# coding=utf-8
import wx
import pymysql
import tkinter
from tkinter import ttk
class reMyFrame(wx.Frame):
"""docstring for register"""
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, title = '用户注册', pos = (500,200), size = (400,450))
panel = wx.Panel(self) #创建画板
self.Tuser = wx.StaticText(panel, label = '用户名:', pos = (10, 70))
self.Cuser = wx.TextCtrl(panel, pos = (90, 70), size = (250,25), style = wx.TE_LEFT)
self.Tpasswd = wx.StaticText(panel, label = '密码:', pos = (10, 100))
self.Cpass = wx.TextCtrl(panel, pos = (90, 100), size = (250,25), style = wx.TE_PASSWORD)
self.Tpasswd_again = wx.StaticText(panel, label = '再次输入密码:', pos = (10, 130))
self.Cpasswd_again = wx.TextCtrl(panel, pos = (90, 130), size = (250,25), style = wx.TE_PASSWORD)
self.Tadd = wx.StaticText(panel, label = '地址:', pos = (10, 160))
self.Cadd = wx.TextCtrl(panel,value="例如:北京、上海、沈阳、成都、广州、all", pos = (90, 160), size = (250,25), style = wx.TE_LEFT)
self.Bcheck = wx.Button(panel, label = '注册', pos = (80,250), size = wx.DefaultSize, style = 0)
self.Bcheck.Bind(wx.EVT_BUTTON, self.onCheck)
self.Bcancel = wx.Button(panel, label = '取消', pos = (220,250), size = wx.DefaultSize, style = 0)
self.Bcancel.Bind(wx.EVT_BUTTON, self.onCancel)
def onCheck(self, event):
user = self.Cuser.GetValue()
passwd = self.Cpass.GetValue()
passwd_again = self.Cpasswd_again.GetValue()
if passwd == passwd_again:
add = self.Cadd.GetValue()
db = pymysql.connect("localhost", "root", "123", "homework")
cursor = db.cursor()
user = "\"" +user+"\""
add = "\'"+add+"\'"
sql = "select * from users where username = %s"%(user)
cursor.execute(sql)
reslist = cursor.fetchone()
cursor.close()
db.close()
if False:
wx.MessageBox('用户名已存在!',u"错误")
else:
passwd = "\"" +passwd+"\""
#print(user + add + passwd)
db = pymysql.connect("localhost", "root", "123", "homework")
cursor = db.cursor()
sql1 = 'insert into users' + '(username,password,address) values('+user + ','+ passwd + ','+ add+')'
print(sql1)
cursor.execute(sql1)
wx.MessageBox('注册成功!',u"成功")
cursor.close()
db.commit()
db.close()
else:
wx.MessageBox('密码输入错误!',u"密码错误")
def onCancel(self, event):
self.Destroy()
if __name__ == '__main__':
app = wx.App()
frame = reMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
(4)用户以及管理员的登陆界面以及后台
from tkinter import *
import wx
import pymysql
from tkinter.messagebox import *
from beijing import *
from chengdu import *
from shenyang import *
from shanghai import *
from guangzhou import *
from all import *
from register import *
class LoginPage(wx.Frame):
def __init__(self, parent, id):
wx.Frame.__init__(self, parent, id, title = '登录界面', pos = (150,100), size = (300,200))
panel = wx.Panel(self) #创建画板
#创建标题,并设置字体
self.title = wx.StaticText(panel,label = '用户登录', pos = (120,20))
font = wx.Font(10,wx.DEFAULT, wx.FONTSTYLE_NORMAL, wx.NORMAL)
self.title.SetFont(font)
#创建输入,文字文本
self.Tuser = wx.StaticText(panel, label = '用户名:', pos = (20, 50))
self.Cuser = wx.TextCtrl(panel, pos = (70, 50), size = (200,25), style = wx.TE_LEFT)
self.Tpass = wx.StaticText(panel, label = '密码:', pos = (20, 90))
self.Cpass = wx.TextCtrl(panel, pos = (70, 90), size = (200,25), style = wx.TE_PASSWORD)
self.Bcheck = wx.Button(panel, label = '登录', pos = (50,120), size = wx.DefaultSize, style = 0)
self.Bcheck.Bind(wx.EVT_BUTTON, self.loginCheck)
self.Bcancel = wx.Button(panel, label = '注册', pos = (150,120), size = wx.DefaultSize, style = 0)
self.Bcancel.Bind(wx.EVT_BUTTON, self.OnclickCancel)
def loginCheck(self, event):
name = self.Cuser.GetValue()
secret = self.Cpass.GetValue()
#print(name)
#print(type(name))
name = "\""+str(name)+"\""
#print (name)
sql = "select * from users where username="+name
db = pymysql.connect("localhost", "root", "123", "homework")
cursor = db.cursor()
cursor.execute(sql)
reslist = cursor.fetchone()
if reslist and reslist[1]==secret:
if reslist[2]=='北京':
self.Destroy()
app = wx.App()
frame = BJMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
elif reslist[2]=='成都':
self.Destroy()
app = wx.App()
frame = CDMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
elif reslist[2]=='广州':
self.Destroy()
app = wx.App()
frame = GZMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
elif reslist[2]=='沈阳':
self.Destroy()
app = wx.App()
frame = SYMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
elif reslist[2]=='上海':
self.Destroy()
app = wx.App()
frame = SHMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
else:
self.Destroy()
app = wx.App()
frame = allMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
else:
wx.MessageBox('账号或密码错误!',u"错误")
def OnclickCancel(self, event):
app = wx.App()
frame = reMyFrame(parent = None, id=-1)
frame.Show()
app.MainLoop()
if __name__ == '__main__':
app = wx.App()
frame = LoginPage(parent = None, id=-1)
frame.Show()
app.MainLoop()
(5)管理员的对空气质量的管理
import pymysql
import tkinter as tk
from tkinter import ttk
from tkinter import scrolledtext
from tkinter import Menu
from tkinter import Spinbox
from tkinter import messagebox as mBox
#由于tkinter中没有ToolTip功能,所以自定义这个功能如下
class ToolTip(object):
def __init__(self, widget):
self.widget = widget
self.tipwindow = None
self.id = None
self.x = self.y = 0
def showtip(self, text):
"Display text in tooltip window"
self.text = text
if self.tipwindow or not self.text:
return
x, y, _cx, cy = self.widget.bbox("insert")
x = x + self.widget.winfo_rootx() + 27
y = y + cy + self.widget.winfo_rooty() +27
self.tipwindow = tw = tk.Toplevel(self.widget)
tw.wm_overrideredirect(1)
tw.wm_geometry("+%d+%d" % (x, y))
label = tk.Label(tw, text=self.text, justify=tk.LEFT,
background="#ffffe0", relief=tk.SOLID, borderwidth=1,
font=("tahoma", "8", "normal"))
label.pack(ipadx=1)
def hidetip(self):
tw = self.tipwindow
self.tipwindow = None
if tw:
tw.destroy()
#===================================================================
def createToolTip( widget, text):
toolTip = ToolTip(widget)
def enter(event):
toolTip.showtip(text)
def leave(event):
toolTip.hidetip()
widget.bind('<Enter>', enter)
widget.bind('<Leave>', leave)
# Create instance
win = tk.Tk()
# Add a title
win.title("管理员")
# Disable resizing the GUI
win.resizable(0,0)
# Tab Control introduced here --------------------------------------
tabControl = ttk.Notebook(win) # Create Tab Control
tab1 = ttk.Frame(tabControl) # Create a tab
tabControl.add(tab1, text='增加数据') # Add the tab
tab2 = ttk.Frame(tabControl) # Add a second tab
tabControl.add(tab2, text='删除数据') # Make second tab visible
tab3 = ttk.Frame(tabControl) # Add a third tab
tabControl.add(tab3, text='修改数据') # Make second tab visible
tabControl.pack(expand=1, fill="both") # Pack to make visible
# ~ Tab Control introduced here -----------------------------------------
#---------------Tab1控件介绍------------------#
# We are creating a container tab3 to hold all other widgets
monty = ttk.LabelFrame(tab1, text='输入数据:')
monty.grid(column=0, row=0, padx=8, pady=4)
# Modified Button Click Function
def put():
db = pymysql.connect(host="localhost", user="root", password="123", database="homework")
cursor = db.cursor()
Place = place.get()
Year = year.get()
Month = month.get()
Day = day.get()
Hour = hour.get()
Pm = pmvalue.get()
Datet = "25"
try:
sql = 'insert into beijing(site,date,year,month,day,hour,value) values("%s","%s",%s,%s,%s,%s,%s)'%(Place,Datet,Year,Month,Day,Hour,Pm)
print(sql)
cursor.execute(sql)
db.commit()
tk.messagebox.showinfo(title='成功', message="插入成功")
except:
db.rollback()
tk.messagebox.showerror(title='Error', message='插入失败')
db.close()
# action.configure(state='disabled') # Disable the Button Widget
def off():
place.set("北京")
year.set("")
month.set("1")
day.set("1")
hour.set("0")
pmvalue.set("")
# Changing our Label
ttk.Label(monty, text="地点:").grid(column=0, row=0, sticky='W')
place = tk.StringVar()
nameEntered1 = ttk.Combobox(monty, width=28, textvariable=place)
nameEntered1['values'] = ('北京','成都','上海','沈阳','广州')
nameEntered1.current(0) #设置初始显示值,值为元组['values']的下标
nameEntered1.grid(column=1, row=0, sticky='W')
ttk.Label(monty, text="年:").grid(column=0, row=1, sticky='W')
year = tk.StringVar()
nameEntered2 = ttk.Entry(monty, width=30, textvariable=year)
nameEntered2.grid(column=1, row=1, sticky='W')
ttk.Label(monty, text="月:").grid(column=0, row=2, sticky='W')
month = tk.StringVar()
nameEntered3 = ttk.Combobox(monty, width=28, textvariable=month)
nameEntered3['values'] = ('1', '2','3','4', '5','6','7', '8','9','10','11','12')
nameEntered3.current(0) #设置初始显示值,值为元组['values']的下标
# nameEntered3.config(state='readonly') #设为只读模式
nameEntered3.grid(column=1, row=2, sticky='W')
ttk.Label(monty, text="日:").grid(column=0, row=3, sticky='W')
day = tk.StringVar()
nameEntered4 = ttk.Combobox(monty, width=28, textvariable=day)
nameEntered4['values'] = ('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')
nameEntered4.current(0)
nameEntered4.grid(column=1, row=3, sticky='W')
ttk.Label(monty, text="时:").grid(column=0, row=4, sticky='W')
hour = tk.StringVar()
nameEntered5 = ttk.Combobox(monty, width=28, textvariable=hour)
nameEntered5['values'] = ('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23')
nameEntered5.current(0)
nameEntered5.grid(column=1, row=4, sticky='W')
ttk.Label(monty, text="PM2.5:").grid(column=0, row=5, sticky='W')
pmvalue = tk.StringVar()
nameEntered6 = ttk.Entry(monty, width=30, textvariable=pmvalue)
nameEntered6.grid(column=1, row=5, sticky='W')
# Adding a Button
action1 = ttk.Button(monty,text="提交",width=10,command=put)
action1.grid(column=0,row=6,ipady=7,padx=1, pady=5)
action2 = ttk.Button(monty,text="重置",width=10,command=off)
action2.grid(column=1,row=6,ipady=7,padx=1, pady=5)
# 一次性控制各控件之间的距离
for child in monty.winfo_children():
child.grid_configure(padx=3,pady=3)
# 单独控制个别控件之间的距离
# action.grid(column=2,row=1,rowspan=2,padx=6)
#---------------Tab1控件介绍------------------#
#---------------Tab2控件介绍------------------#
# We are creating a container tab3 to hold all other widgets -- Tab2
monty2 = ttk.LabelFrame(tab2, text='输入数据:')
monty2.grid(column=0, row=0, padx=8, pady=4)
def delete1():
db = pymysql.connect(host="localhost", user="root", password="123", database="homework")
cursor = db.cursor()
Place1 = place1.get()
Year1 = year1.get()
Month1 = month1.get()
Day1 = day1.get()
Hour1 = hour1.get()
#sql = 'delete from beijing where site="%s" and year=%s and month=%s and day=%s and hour=%s'%(Place1,Datet1,Year1,Month1,Day1,Hour1,Pm1)
try:
sql1 = 'delete from beijing where year=%s and month=%s and day=%s and hour=%s'%(Year1,Month1,Day1,Hour1)
#sql = 'insert into beijing(site,date,year,month,day,hour,value) values("%s","%s",%s,%s,%s,%s,%s)'%(Place1,Datet1,Year1,Month1,Day1,Hour1,Pm1)
print(sql1)
cursor.execute(sql1)
db.commit()
tk.messagebox.showinfo(title='成功', message="删除成功")
except:
db.rollback()
tk.messagebox.showerror(title='Error', message='删除失败')
db.close()
def off1():
place1.set("北京")
year1.set("")
month1.set("1")
day1.set("1")
hour1.set("0")
ttk.Label(monty2, text="地点:").grid(column=0, row=0, sticky='W')
place1 = tk.StringVar()
_Entered1 = ttk.Combobox(monty2, width=28, textvariable=place1)
_Entered1['values'] = ('北京','成都','上海','沈阳','广州')
_Entered1.current(0) #设置初始显示值,值为元组['values']的下标
_Entered1.grid(column=1, row=0, sticky='W')
ttk.Label(monty2, text="年:").grid(column=0, row=1, sticky='W')
year1 = tk.StringVar()
_Entered2 = ttk.Entry(monty2, width=30, textvariable=year1)
_Entered2.grid(column=1, row=1, sticky='W')
ttk.Label(monty2, text="月:").grid(column=0, row=2, sticky='W')
month1 = tk.StringVar()
_Entered3 = ttk.Combobox(monty2, width=28, textvariable=month1)
_Entered3['values'] = ('1', '2','3','4', '5','6','7', '8','9','10','11','12')
_Entered3.current(0)
_Entered3.grid(column=1, row=2, sticky='W')
ttk.Label(monty2, text="日:").grid(column=0, row=3, sticky='W')
day1 = tk.StringVar()
_Entered4 = ttk.Combobox(monty2, width=28, textvariable=day1)
_Entered4['values'] = ('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')
_Entered4.current(0)
_Entered4.grid(column=1, row=3, sticky='W')
ttk.Label(monty2, text="时:").grid(column=0, row=4, sticky='W')
hour1 = tk.StringVar()
_Entered5 = ttk.Combobox(monty2, width=28, textvariable=hour1)
_Entered5['values'] = ('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23')
_Entered5.current(0)
_Entered5.grid(column=1, row=4, sticky='W')
# Adding a Button
action3 = ttk.Button(monty2,text="删除",width=10,command=delete1)
action3.grid(column=0,row=6,ipady=7,padx=1, pady=5)
action4 = ttk.Button(monty2,text="重置",width=10,command=off1)
action4.grid(column=1,row=6,ipady=7,padx=1, pady=5)
# 一次性控制各控件之间的距离
for child in monty2.winfo_children():
child.grid_configure(padx=3,pady=8)
#---------------Tab2控件介绍------------------#
#---------------Tab3控件介绍------------------#
monty3 = ttk.LabelFrame(tab3, text='输入数据:')
monty3.grid(column=0, row=0, padx=8, pady=4)
def delete2():
db = pymysql.connect(host="localhost", user="root", password="123", database="homework")
cursor = db.cursor()
Place2 = place2.get()
Year2 = year2.get()
Month2 = month2.get()
Day2 = day2.get()
Hour2 = hour2.get()
Pmvalue2 = pmvalue2.get()
#sql = 'delete from beijing where site="%s" and year=%s and month=%s and day=%s and hour=%s'%(Place1,Datet1,Year1,Month1,Day1,Hour1,Pm1)
try:
sql2 = 'update beijing set value=%s where year=%s and month=%s and day=%s and hour=%s'%(Pmvalue2,Year2,Month2,Day2,Hour2)
#sql = 'insert into beijing(site,date,year,month,day,hour,value) values("%s","%s",%s,%s,%s,%s,%s)'%(Place1,Datet1,Year1,Month1,Day1,Hour1,Pm1)
print(sql2)
cursor.execute(sql2)
db.commit()
tk.messagebox.showinfo(title='成功', message="修改成功")
except:
print(sql2)
db.rollback()
tk.messagebox.showerror(title='Error', message='修改失败')
db.close()
def off2():
place2.set("北京")
year2.set("")
month2.set("1")
day2.set("1")
hour2.set("0")
pmvalue2.set("")
ttk.Label(monty3, text="地点:").grid(column=0, row=0, sticky='W')
place2 = tk.StringVar()
Entered1_ = ttk.Combobox(monty3, width=28, textvariable=place2)
Entered1_['values'] = ('北京','成都','上海','沈阳','广州')
Entered1_.current(0) #设置初始显示值,值为元组['values']的下标
Entered1_.grid(column=1, row=0, sticky='W')
ttk.Label(monty3, text="年:").grid(column=0, row=1, sticky='W')
year2 = tk.StringVar()
Entered2_ = ttk.Entry(monty3, width=30, textvariable=year2)
Entered2_.grid(column=1, row=1, sticky='W')
ttk.Label(monty3, text="月:").grid(column=0, row=2, sticky='W')
month2 = tk.StringVar()
Entered3_ = ttk.Combobox(monty3, width=28, textvariable=month2)
Entered3_['values'] = ('1', '2','3','4', '5','6','7', '8','9','10','11','12')
Entered3_.current(0)
Entered3_.grid(column=1, row=2, sticky='W')
ttk.Label(monty3, text="日:").grid(column=0, row=3, sticky='W')
day2 = tk.StringVar()
Entered4_ = ttk.Combobox(monty3, width=28, textvariable=day2)
Entered4_['values'] = ('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')
Entered4_.current(0)
Entered4_.grid(column=1, row=3, sticky='W')
ttk.Label(monty3, text="时:").grid(column=0, row=4, sticky='W')
hour2 = tk.StringVar()
Entered5_ = ttk.Combobox(monty3, width=28, textvariable=hour2)
Entered5_['values'] = ('0','1','2','3','4','5','6','7','8','9','10','11','12','13','14','15','16','17','18','19','20','21','22','23')
Entered5_.current(0)
Entered5_.grid(column=1, row=4, sticky='W')
ttk.Label(monty3, text="PM2.5:").grid(column=0, row=5, sticky='W')
pmvalue2 = tk.StringVar()
Entered6_ = ttk.Entry(monty3, width=30, textvariable=pmvalue2)
Entered6_.grid(column=1, row=5, sticky='W')
# Adding a Button
action3 = ttk.Button(monty3,text="修改",width=10,command=delete2)
action3.grid(column=0,row=6,ipady=7,padx=1, pady=5)
action4 = ttk.Button(monty3,text="重置",width=10,command=off2)
action4.grid(column=1,row=6,ipady=7,padx=1, pady=5)
# 一次性控制各控件之间的距离
for child in monty3.winfo_children():
child.grid_configure(padx=3,pady=3)
#---------------Tab3控件介绍------------------#
win.mainloop()
(5)日志功能的实现
略,此处还可以增加一个功能用来管理数据的安全
(6)用户管理用户
未完待续
优点
1.实现数据可视化
2.实现权限管理
3.使用索引增加数据库的查找速度
4.使用日志,可以加上缓存以及事务调度,增加数据库的安全性