python学习

一个小错误
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.使用日志,可以加上缓存以及事务调度,增加数据库的安全性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值