利用python中的tkinter来开发自己的小程序或小工具之查询数据库并返回和导出查询结果

本人也是python小白,各位大佬不要喷,毕竟咱不是专业的开发的,只是为了偷懒,写一下自己的小程序,如果大佬可以帮自己完善一下的话,自己也是很高兴的。

  • 这个工具可以用来干什么
  • 如果你需要经常的从数据库里面提取数据,那么他可以帮你实现
  • 如果你热爱爬虫的话,需要美化一下操作界面的话,那么你可能需要他
  • 如果你想逗你女朋友开心的话,那么你可能值得拥有他
  • 等等等等等。。。

先来看看效果

建议一定要看这个效果图哈,否则,你到下面的代码就是一脸懵

python运维小工具(1)

1. 思路

思路是非常重要的,有一个好的思路,能让自己事半功倍

我的实例工具,思路如下

  • 利用tkinter来构建基本的工具框架,也就是程序或者工具UI界面(小编是找了张A4纸,用铅笔花出来的,\哭)
  • 需要具体能实现功能的python代码,需要镶嵌到框架中
  • 建立个测试环境,测试一下看看效果如何

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:这个是连接数据库用的,我这边的是sql server数据库
  • import datetime:这个是获取当前时间用的,主要是一个导出文件的时候命名作用
  • import openpyxl:这个是操作execl用的,把查询结果写入到execl表中
  • import split:这个是字符切割用的
  • import time:这个用来时间延长的。time.sleep
  • 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()  # 进入消息循环

结束语

  • 小编写的这个程序是固定死的,但是思路是活得,主要是让大家理解一下思路。
  • 小编的技术有限,希望大家不要建议,如果大家有什么好的建议,不妨评论出来,大家一起分享一下
  • 最后就是希望和大家一起努力,创建更加美好的明天,为社会技术贡献一份自己的力量
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐