利用python中的tkinter来开发自己的小程序或小工具之查询数据库并返回和导出查询结果
本人也是python小白,各位大佬不要喷,毕竟咱不是专业的开发的,只是为了偷懒,写一下自己的小程序,如果大佬可以帮自己完善一下的话,自己也是很高兴的。
- 这个工具可以用来干什么
先来看看效果
建议一定要看这个效果图哈,否则,你到下面的代码就是一脸懵
python运维小工具(1)
1. 思路
思路是非常重要的,有一个好的思路,能让自己事半功倍
我的实例工具,思路如下
2. 实操
先引入我们需要的模板
#!/usr/bin/env python
# coding:gbk
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
再构建出我们需要的大框
也就是我们外面用到的大框
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
root = tk.Tk() # 创建窗口对象的背景色
root.title("Voc --统计长期离线企业小助手 v1.10 Mr.liu") #这个就是大框左上角的文字显示
root.geometry("950x300") #这个是框的大小
root.mainloop() # 进入消息循环
效果如下:
再构建出里面的小框
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
root = tk.Tk() # 创建窗口对象的背景色
root.title("Voc --统计长期离线企业小助手 v1.10 Mr.liu") #这个就是大框左上角的文字显示
root.geometry("950x300") #这个是框的大小
#当前不会显示出来这个框,因为框里面没有内容
denglu = tk.LabelFrame(root,text="登录",padx=10,pady=5)
denglu.grid(row=0,sticky='N',column=0,padx=10,pady=10)
#当前不会显示出来这个框,因为框里面没有内容
jg = tk.LabelFrame(root,text="查询结果",padx=10,pady=10)
jg.grid(row=0,rowspan=2,column=1,sticky='N',padx=10,pady=10)
root.mainloop() # 进入消息循环
效果和上面的一样:
再给左边的这个框里面添加内容
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
root = tk.Tk() # 创建窗口对象的背景色
root.title("Voc --统计长期离线企业小助手 v1.10 Mr.liu") #这个就是大框左上角的文字显示
root.geometry("950x300") #这个是框的大小
denglu = tk.LabelFrame(root,text="登录",padx=10,pady=5)
denglu.grid(row=0,sticky='N',column=0,padx=10,pady=10)
##下面的这四行对应的下面的效果图看,比较容易理解
tk.Label(denglu,text= "数据库ip:").grid(row=0,column=0)
tk.Label(denglu,text= "数据库端口:").grid(row=1,column=0)
tk.Label(denglu,text= "数据库账户:").grid(row=2,column=0)
tk.Label(denglu,text= "数据库密码:").grid(row=3,column=0)
jg = tk.LabelFrame(root,text="查询结果",padx=10,pady=10)
jg.grid(row=0,rowspan=2,column=1,sticky='N',padx=10,pady=10)
root.mainloop() # 进入消息循环
效果图:
再给这四个标签添加后面的输入框
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
root = tk.Tk() # 创建窗口对象的背景色
root.title("Voc --统计长期离线企业小助手 v1.10 Mr.liu") #这个就是大框左上角的文字显示
root.geometry("950x300") #这个是框的大小
denglu = tk.LabelFrame(root,text="登录",padx=10,pady=5)
denglu.grid(row=0,sticky='N',column=0,padx=10,pady=10)
tk.Label(denglu,text= "数据库ip:").grid(row=0,column=0)
tk.Label(denglu,text= "数据库端口:").grid(row=1,column=0)
tk.Label(denglu,text= "数据库账户:").grid(row=2,column=0)
tk.Label(denglu,text= "数据库密码:").grid(row=3,column=0)
##下面就是添加输入框部分
v1 = tk.StringVar()
v2 = tk.StringVar()
v3 = tk.StringVar()
v4 = tk.StringVar()
e1 = tk.Entry(denglu, textvariable=v1)
e2 = tk.Entry(denglu, textvariable=v2)
e3 = tk.Entry(denglu, textvariable=v3)
e4 = tk.Entry(denglu, textvariable=v4, show="*")
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3.grid(row=2, column=1, padx=10, pady=5)
e4.grid(row=3, column=1, padx=10, pady=5)
###
jg = tk.LabelFrame(root,text="查询结果",padx=10,pady=10)
jg.grid(row=0,rowspan=2,column=1,sticky='N',padx=10,pady=10)
root.mainloop() # 进入消息循环
效果如下:
输入框里面可以输入内容了,那我们需要将用户输入到框中的内容,get出来
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
root = tk.Tk() # 创建窗口对象的背景色
root.title("Voc --统计长期离线企业小助手 v1.10 Mr.liu") #这个就是大框左上角的文字显示
root.geometry("950x300") #这个是框的大小
denglu = tk.LabelFrame(root,text="登录",padx=10,pady=5)
denglu.grid(row=0,sticky='N',column=0,padx=10,pady=10)
tk.Label(denglu,text= "数据库ip:").grid(row=0,column=0)
tk.Label(denglu,text= "数据库端口:").grid(row=1,column=0)
tk.Label(denglu,text= "数据库账户:").grid(row=2,column=0)
tk.Label(denglu,text= "数据库密码:").grid(row=3,column=0)
v1 = tk.StringVar()
v2 = tk.StringVar()
v3 = tk.StringVar()
v4 = tk.StringVar()
e1 = tk.Entry(denglu, textvariable=v1)
e2 = tk.Entry(denglu, textvariable=v2)
e3 = tk.Entry(denglu, textvariable=v3)
e4 = tk.Entry(denglu, textvariable=v4, show="*")
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3.grid(row=2, column=1, padx=10, pady=5)
e4.grid(row=3, column=1, padx=10, pady=5)
##创建一个def ,因为下面需要个按钮来触发他
def ceshi_sql():
#利用异常判断,如果能正常连接则提示测试连接成功
try:
conn = pymssql.connect(host=e1.get(), user=e3.get(),port=e2.get(),password=e4.get())
#输入框里面取值就在这里,e1.get()
tk.messagebox.askokcancel("提示","测试连接成功") #弹出提示框的功能
conn.close() #断开数据库连接
except Exception as e:
##如果不能连接则将异常e抛出
tk.messagebox.askokcancel("提示", e)
## 增加两个按钮,一个连接测试,一个退出,注意按钮触发的是command后面的def函数,这里没有()哈,注意
tk.Button(denglu, text="连接测试", width=10, command=ceshi_sql).grid(row=4, column=0, sticky='W', padx=10, pady=5) # W左边
tk.Button(denglu, text="退出", width=10, command=root.quit).grid(row=4, column=1, sticky='E', padx=10, pady=5) # E右边
jg = tk.LabelFrame(root,text="查询结果",padx=10,pady=10)
jg.grid(row=0,rowspan=2,column=1,sticky='N',padx=10,pady=10)
root.mainloop() # 进入消息循环
效果图:
看到了这里相信大家也是不是感觉非常简单可呢,下面小编就把第二个框里面的内容结合源码一起讲了哈
整体源码:
#!/usr/bin/env python
# coding:gbk
import tkinter as tk
import tkinter.messagebox
import pymssql
import datetime
import openpyxl
import split
import time
import os
import sys
root = tk.Tk() # 创建窗口对象的背景色
root.title("Voc --统计长期离线企业小助手 v1.10 Mr.liu")
root.geometry("950x300")
#第一个框开始
denglu = tk.LabelFrame(root,text="登录",padx=10,pady=5)
denglu.grid(row=0,sticky='N',column=0,padx=10,pady=10)
tk.Label(denglu,text= "数据库ip:").grid(row=0,column=0)
tk.Label(denglu,text= "数据库端口:").grid(row=1,column=0)
tk.Label(denglu,text= "数据库账户:").grid(row=2,column=0)
tk.Label(denglu,text= "数据库密码:").grid(row=3,column=0)
v1 = tk.StringVar()
v2 = tk.StringVar()
v3 = tk.StringVar()
v4 = tk.StringVar()
e1 = tk.Entry(denglu, textvariable=v1)
e2 = tk.Entry(denglu, textvariable=v2)
e3 = tk.Entry(denglu, textvariable=v3)
e4 = tk.Entry(denglu, textvariable=v4, show="*")
e1.grid(row=0, column=1, padx=10, pady=5)
e2.grid(row=1, column=1, padx=10, pady=5)
e3.grid(row=2, column=1, padx=10, pady=5)
e4.grid(row=3, column=1, padx=10, pady=5)
def ceshi_sql():
try:
conn = pymssql.connect(host=e1.get(), user=e3.get(),port=e2.get(),password=e4.get())
tk.messagebox.askokcancel("提示","测试连接成功")
conn.close()
except Exception as e:
tk.messagebox.askokcancel("提示", e)
tk.Button(denglu, text="连接测试", width=10, command=ceshi_sql).grid(row=4, column=0, sticky='W', padx=10, pady=5) # W左边
tk.Button(denglu, text="退出", width=10, command=root.quit).grid(row=4, column=1, sticky='E', padx=10, pady=5) # E右边
###第二个框的开始
###创建框
jg = tk.LabelFrame(root,text="查询结果",padx=10,pady=10)
jg.grid(row=0,rowspan=2,column=1,sticky='N',padx=10,pady=10)
###引入一个文本框text,设置他的大小为width=80,height=15
text=tk.Text(jg,width=80,height=15)
###创建一个滚动条,因为要显示的内容太多,没有滚动条,看不全部
scroll=tk.Scrollbar(jg)
scroll.grid(row=0,column=1)
text.grid(row=0,column=0)
#创建是上下滚动的条:y
scroll.config(command=text.yview)
text.config(yscrollcommand=scroll.set)
#创建一个def,让他可以被抹个按钮触发
def chaxun():
sql = 'select * from ceshi'
##利用异常处理
try:
#主要实现的功能,就是到一个库里面执行一个sql语句,如果大家有需要可以自己设置
chaxun_conn = pymssql.connect(host=e1.get(), user=e3.get(),port=e2.get(),password=e4.get(), database='ya',charset='cp936')
chaxun_conn.autocommit(True)
cursor = chaxun_conn.cursor()
#text文本域里面最开始显示空白
text.delete(0.0, tk.END)
#执行sql语句
cursor.execute(sql)
#拿到语句查询结果
jieguo = cursor.fetchall()
cursor.close() #连接完一定要断开连接哈,数据库最怕没有这个
###
###下面的是一个execl的写入,可以自己根据自己的实际情况改写
wb = openpyxl.Workbook()
#sheet命名为长期离线企业数据统计'
ws = wb.create_sheet('长期离线企业数据统计')
#execl里面第一行第一列显示“字段名1”
ws.cell(row=1, column=1).value = "字段名1"
#execl里面第一行第二列显示“字段名2”
ws.cell(row=1, column=2).value = "字段名2"
#execl里面第一行第三列显示“字段名3”
ws.cell(row=1, column=3).value = "字段名3"
ws.cell(row=1, column=4).value = "字段名4"
ws.cell(row=1, column=5).value = "字段名5"
ws.cell(row=1, column=6).value = "字段名6"
ws.cell(row=1, column=7).value = "字段名7"
ws.cell(row=1, column=8).value = "字段名8"
ws.cell(row=1, column=9).value = "字段名9"
ws.cell(row=1, column=10).value = "字段名10"
x = 1
for i in jieguo:
x+=1
y = 1
ii = str(i) + '\n'
text.insert(tk.INSERT,ii) #这个是写入到文本域里面
for n in i:
ws.cell(row=x, column=y).value = n
y+=1
else:
text.insert(tk.END,'===================查询结束====================\n')
today = ((str(datetime.datetime.now())).split('.')[0]).replace(':', "-")
name = today + '长期离线企业数据.xlsx'
##保存execl
wb.save(name)
time.sleep(2)
##获取当前路径
pwd = os.getcwd()
file_pwd = pwd + '\\' + name
mess = '导出的文件保存于:' + file_pwd
##提示出,文件被保存的位置,方便查找文件
tk.messagebox.askokcancel("提示", mess)
except Exception as e:
text.delete(0.0, tk.END)
jieguo = '\n======================不是有效的查询,请先【连接测试】======================='
text.insert(tk.INSERT, jieguo)
text.insert(tk.INSERT, e)
#关联
#创建一个函数,等待按钮触发
def show():
tk.messagebox.askokcancel("提示", '功能在进一步的确认中......')
#创建一个按钮,触发chaxun函数,也就是上面的def函数
tk.Button(root, text="开始查询并导出文件", width=20, command=chaxun).grid(sticky='ws',row=1,column=0,padx=30, pady=5) # W左边
tk.Button(root, text="功能待定", width=10, command=show).grid(sticky='es',row=1,column=0, padx=30, pady=5) # W左边
root.mainloop() # 进入消息循环
结束语