python 通过ttk模块定时查询数据并数据已邮件的方式发给指定用户

一、前言:

1、项目背景

①、利用python 模块自动定时查询数据并已邮件的方式将数据发送给指定人员;

②、提高工作效率;

2、开发工具及环境:

①、pycharm 专业版

②、windos 10 64

3、项目中使用到python库:

# -*- encoding:utf-8 -*-
import datetime
import sys
import time
import tkinter
from tkinter import Tk
from tkinter.ttk import Label, LabelFrame, Button
import tkinter.messagebox
import threading

import pyodbc
import yagmail
import pandas as pd
import os
from dateutil.relativedelta import relativedelta

4、项目所有源代码

# -*- encoding:utf-8 -*-
import datetime
import sys
import time
import tkinter
from tkinter import Tk
from tkinter.ttk import Label, LabelFrame, Button
import tkinter.messagebox
import threading

import pyodbc
import yagmail
import pandas as pd
import os
from dateutil.relativedelta import relativedelta


def open_mysql(number1, number2):  # 连接sql server数据库并返回查询的数据
    open_service = pyodbc.connect('DRIVER={SQL Server}', SERVER='xxxxx', DATABASE='xxx', UID='xxxxxx',
                                  PWD=xxxxx')  #连接考勤数据库
    cursor = open_service.cursor()
    cursor.execute(
        f"SELECT BADGENUMBER, CHECKTIME FROM dbo.CHECKINOUT A JOIN dbo.USERINFO B ON A.USERID = B.USERID WHERE A.SENSORID = 22 AND A.CHECKTIME>'{number1}' AND A.CHECKTIME <='{number2}'")   #执行查询动作
    select_mysql = cursor.fetchall()   #将查询的数据进行赋值
    return select_mysql   #反馈数据


def sed_email(day, path):  # 调用email接口发送数据
    try:
        configuration_email = yagmail.SMTP(user='1054860787@qq.com', password='xxxxxxx', host='smtp.qq.com')
        configuration_email.send(to='xxxxxxxx',
                                 subject=f'{day}检验中心门禁刷卡数据',
                                 contents=f'{day}检验中心门禁刷卡数据',
                                 attachments=f'{path}')  ##cc 是抄送邮件功能
    except:
        tkinter.messagebox.showinfo('提示', '邮件发送失败,请检查邮箱地址是否正常,谢谢!')


def start_task():  # 调用多线程执行查询任务
    t = threading.Thread(target=delete_file)   #创建线程
    t.setDaemon(True)    #保护主线程
    t.start()


def delete_file():  # 主任务进程
    path = 'D:\\inspect\\'
    if os.path.exists(path):  #判断路劲是否存在
        tkinter.messagebox.showinfo('提醒', f'{path}路劲已存在')   #弹框路劲已存在
    else:
        os.mkdir(path)    #路劲不存在时创建路劲
    start_button['stat'] = 'disabled'
    global stat_button
    stat_button = True
    while True:
        if stat_button:
            today_time = datetime.datetime.today()  # 获取当日的日期及时间
            print(today_time)
            str_day = today_time.strftime("%Y-%m-%d %H:%M:%S")  # 将时间转化为字符串格式
            str_day_split = str_day.split(' ')  # 对时间格式进行字符串分割
            date = datetime.datetime.strptime(str_day_split[0], '%Y-%m-%d')  # 转化成日期格式
            if str_day_split[1] == '10:15:20':
                one_day = date.replace(day=1)  # 获取当月第一天
                next_one_day = one_day + relativedelta(months=+1)  # 当下月第一天日期
                last_one_day = (next_one_day - datetime.timedelta(days=1)) + relativedelta(hours=23, minute=59,
                                                                                           seconds=59)  # 当月最后一天日期
                date_mysql = open_mysql(one_day, last_one_day)  # 调用open_mysql 函数查询数据
                new_list = []
                for i in date_mysql:
                    new_list.append(list(i))
                execl_data = pd.DataFrame(new_list, columns=['员工编号', 'Work Times'])

                file_path = f'{path}{str_day_split[0]}.xlsx'  # 创建文件保存路劲及文件名称
                execl_data.to_excel(file_path)  # 将数据保存为execl文件
                sed_email(str_day_split[0], file_path)  # 调用邮件函数发送邮件
                os.remove(file_path)  # 删除数据
                print('考勤数据发送成功')


            else:
                print('程序持续检测中...')
            time.sleep(1)
        else:
            break


def stop_task():  # 取消执行任务动作
    start_button['stat'] = 'active'
    global stat_button
    stat_button = False


# def close_Messagebox():
#     yes_no = tkinter.messagebox.askyesno('提示','程序正在运行是否退出')
#     root.after(600, root.destroy)
#     return yes_no


def exit_task():  # 退出程序命令
    if stat_button:
        task_yes = tkinter.messagebox.askyesno('提示', '程序正在运行是否确定退出')
        if task_yes:
            sys.exit()
    else:
        sys.exit()

    # sys.exit()


if __name__ == '__main__':  # 程序主函数
    root = Tk()  # 创建TK对象
    global stat_button
    stat_button = False
    root.title('检验中心门禁数据定时发送程序')  #程序的标题
    root.geometry('410x210+10+10')  # 窗体大小
    root.resizable(0, 0)  # 窗体大小不允许改变
    # 页面布局   #定义的变量1
    labelF = LabelFrame(root, text="功能区:") #创建一块幕布并将名称命名为:功能区
    # filename1 = StringVar()   #定义的变量1
    # output_path = StringVar()   #定义的变量2
    start_button = Button(labelF, text="开始执行", command=lambda: start_task())  # 开始执行按钮
    start_button.place(width=80, x=80, y=50, height=60)
    stop_button = Button(labelF, text="取消执行", command=stop_task)  # 取消执行按钮
    stop_button.place(width=80, x=240, y=50, height=60)
    labelF.place(height=200, width=400, x=2, y=2)
    exit_button = Button(labelF, text="退  出", command=exit_task)  # 退出程序按钮
    exit_button.place(width=60, x=330, y=130, height=35)

    root.mainloop()

5、感谢大家支持,后续将持续分享更多优秀分文档

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值