我的编程空间,编程开发者的网络收藏夹
学习永远不晚

pyqt5_站点管理_WaterClient_1

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

pyqt5_站点管理_WaterClient_1

主界面:

*程序中有错误,过段时间再回头修改.

from PyQt5.QtWidgets import QApplication,QWidget,QStatusBar,QTabWidget,QVBoxLayout
from PyQt5.QtGui import QIcon,QPalette,QBrush,QPixmap
from PyQt5.QtCore import QTimer
import sys,os,time,datetime,smtplib,pickle,pymssql
import index_windows,stcd_windows,db_windows,email_windows,img
from email import encoders
from email.header import Header
from email.utils import parseaddr,formataddr
from email.mime.text import MIMEText
#定义主程序界面:
class mainwindows(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()
    def initUI(self):
        #设置标题和大小
        self.qicon1 = QIcon(':/IMG/1.png')
        self.qicon2 = QIcon(':/IMG/2.png')
        self.qicon3 = QIcon(':/IMG/3.png')
        self.qicon4 = QIcon(':/IMG/4.png')
        self.windows_icon_timer_num = 1
        self.windows_icon_timer = QTimer(self)
        self.windows_icon_timer.timeout.connect(self.windows_icon_timer_changed)
        self.windows_icon_timer.start(500)
        #背景图片
        palette = QPalette()
        palette.setBrush(QPalette.Background,QBrush(QPixmap(':/IMG/window_bg.png')))
        self.setPalette(palette)
        self.resize(800,600)
        self.setWindowTitle('检测软件')
        #定义tabwidget:1,首页 2,站点配置,3,数据库配置,4,邮件配置,5,其他配置
        #1,首页
        self.index_window = index_windows.index_window()
        #2,站点配置
        self.stcd_window = stcd_windows.stcd_window()
        #3,数据库配置
        self.db_window = db_windows.db_window()
        #4,邮件配置
        self.email_window = email_windows.email_window()
        #5,其他配置
        self.ather_window = QWidget()
        #定义tabwidget
        self.tabwidget = QTabWidget()
        self.tabwidget.insertTab(0,self.index_window,QIcon(':/IMG/index.png'),'首页')
        self.tabwidget.insertTab(1,self.stcd_window,QIcon(':/IMG/stcd.png'),'站点')
        self.tabwidget.insertTab(2,self.db_window,QIcon(':/IMG/database.png'),'数据库')
        self.tabwidget.insertTab(3,self.email_window,QIcon(':/IMG/mail.png'),'邮件')
        self.tabwidget.insertTab(4,self.ather_window,QIcon(':/IMG/information.png'),'杂项')
        # 设置状态栏
        self.statusBar = QStatusBar(self)
        #布局管理
        vbox = QVBoxLayout()
        vbox.addWidget(self.tabwidget)
        vbox.addWidget(self.statusBar)
        self.setLayout(vbox)
        self.show()
        self.auto_start_timer = QTimer(self)
        self.auto_start_timer.timeout.connect(self.auto_start)
        self.auto_start_timer.start(60000)
    def windows_icon_timer_changed(self):
        if self.windows_icon_timer_num == 1:
            self.setWindowIcon(self.qicon1)
            self.windows_icon_timer_num = 2
        elif self.windows_icon_timer_num == 2:
            self.setWindowIcon(self.qicon2)
            self.windows_icon_timer_num = 3
        elif self.windows_icon_timer_num == 3:
            self.setWindowIcon(self.qicon3)
            self.windows_icon_timer_num = 4
        elif self.windows_icon_timer_num == 4:
            self.setWindowIcon(self.qicon4)
            self.windows_icon_timer_num = 1
        else:
            self.windows_icon_timer_num = 1

    def get_time(time_flag='', d=0, H=0, M=0):
        time_now = datetime.datetime.today()
        try:
            if time_flag == 'YMD':
                time_d = time_now + datetime.timedelta(days=d)
                return str(time_d).split()[0]
                # 2017-03-10
            elif time_flag == 'DHM':
                time_M = time_now + datetime.timedelta(minutes=M)
                time_H = time_M + datetime.timedelta(hours=H)
                time_D = time_H + datetime.timedelta(days=d)
                return str(time_D).split('.')[0]
                # 2017-03-10 14:00:39
            elif time_flag == 'NOW':
                time_1 = str(time_now).split()[0]
                hour = time.localtime().tm_hour
                return time_1 + ' ' + str(hour) + ':03:00'
            elif time_flag == 'HOUR':
                time_H = time_now + datetime.timedelta(hours=-1)
                time_1 = str(time_H).split()[0]
                hour = str(time_H).split()[1].split(':')[0]
                return time_1 + ' ' + hour + ':03:00'
            else:
                return str(time_now).split('.')[0]
                # 2017-03-10 14:00:39
        except Exception as error:
            return '2017-1-1 00:00:00'
            # 2017-03-10 14:00:39
    def write_log(self,message):
        self.index_window.index_textedit.append(self.get_time() + ':  %s\n'%message)

    def path_exists(self,file_path):
        # return 2:文件不存在
        # return 0:不是文件夹,且有内容
        # return 1:是文件夹
        try:
            if os.path.exists(file_path):
                if os.path.isfile(file_path):
                    if os.path.getsize(file_path) > 0:
                        return 0
                    else:
                        os.remove(file_path)
                        return 2
                else:
                    return 1
            else:
                return 2
        except Exception as error:
            self.write_log(repr(error))

    def frist_runsql(self,DBconfig_path):
        # return 1:链接数据库错误
        # 说明:第一次在服务器上运行时候,初始化服务器数据信息
        self.write_log('--------------------第一次初始化数据库信息--------------------')
        # 用于链接数据库,查询数据库内容,return 0:success   1,2,3,4...error
        try:
            conn = pymssql.connect(**self.db_window.dir_db)
        except Exception as error:
            self.write_log('第一次初始化过程中,连接数据库错误:\n' + repr(error))
            self.statusBar.showMessage('数据库链接错误.')
            return 1

        try:
            cur = conn.cursor()
            # 得到数据库游标
            cur.execute('SELECT Name FROM Master..SysDatabases;')
            # 得到所有数据库名称
            row = cur.fetchone()
            error_status = 0
            db_list = []
            # 标记错误次数
            while row:
                if row[0] == 'water' or row[0] == 'STDDB_V380':
                    self.write_log('数据库中存在%s数据库.' % row[0])
                    db_list.append(row[0])
                    error_status = error_status + 2
                else:
                    self.write_log('扫描到的其他数据库名称:' + row[0])
                row = cur.fetchone()
            if len(db_list) == 0:
                return 0
            try:
                file_water = open(DBconfig_path, 'wb')
                pickle.dump(db_list, file_water)
            except Exception as error:
                self.write_log('初始化过程中,%s数据库处理部分,错误信息:\n' % row[0] + repr(error))
                error_status = error_status + 5
            finally:
                try:
                    file_water.close()
                except Exception as error:
                    self.write_log('关闭%s文件出错:\n' % row[0] + repr(error))

        except Exception as error:
            self.write_log('初始化数据过程中,存在的问题:\n' + repr(error))
        finally:
            try:
                cur.close()
                conn.close()
                self.write_log('----------------------初始化数据信息完成----------------------')
                return error_status
            except Exception as error:
                self.write_log('初始化数据库过程中,关闭数据库出错:' + repr(error))
                return error_status + 7

    def runsql(self,sql, DBname, TABLE_NAME):
        # return 1:数据库链接错误
        # return 2:
        try:
            conn = pymssql.connect(**self.db_window.dir_db, database=DBname)
        except pymssql.InterfaceError as intererror:
            # 链接不了数据库
            # print('链接不上数据库')
            # 记录连接日志
            log = '程序无法连接数据库!'
            self.write_log(DBname + log + repr(intererror))
            with open('.//DATA//error.log', 'a') as error_rite:
                error_rite.write('执行数据库查询,链接数据库失败.')
            return (1, [])
        except Exception as error:
            self.write_log(DBname + repr(error))
            with open('.//DATA//error.log', 'a') as error_rite:
                error_rite.write('数据库执行错误%s' % repr(error), )
                return (1, [])
        try:
            self.statusBar.showMessage('数据库链接正常.')
            # print('================连接数据库==========================')
            cur = conn.cursor()
            # 得到数据库游标
            cur.execute(sql)
            # 得到所有数据库名称
            row = cur.fetchone()
            try:
                row_list = []

                while row:
                    try:
                        row_list.append((str(row[0]).strip(), str(row[1]), row[2]))
                    except Exception as error_1:
                        self.write_log('%s行处理数据结果过程中,错误:\n' % TABLE_NAME + repr(error_1))
                    finally:
                        row = cur.fetchone()
            except Exception as error:
                self.write_log('数据库列表过程中,错误:\n' + repr(error))

        except Exception as error:
            # print('error--------1--------' + repr(error))
            self.write_log('%s执行错误' % TABLE_NAME + repr(error))
        finally:
            try:
                cur.close()
                conn.close()
                return (0, row_list)
            except Exception as error:
                self.write_log(TABLE_NAME + ':关闭数据库出错!' + repr(error))
            finally:
                self.write_log(TABLE_NAME + '-->数据脚本执行完成!')

    def run_sql(self):
        # 说明:执行数据库查询脚本
        try:
            # return 0 :ok
            # return 1 :error
            info_list_path = './/DATA//info.pik'
            info_list_path_num = self.path_exists(info_list_path)
            pickle_infolist_num = 0
            if info_list_path_num == 1:
                os.remove(info_list_path)
                pickle_infolist_num = self.pickle_infolist()
            elif info_list_path_num == 2:
                pickle_infolist_num = self.pickle_infolist()

            if pickle_infolist_num == 1:
                return 1
        except Exception as error:
            self.write_log('执行数据库查询,最初阶段出错!\n' + repr(error))

        try:
            config_path = './/DATA//DBconfig.pik'
            config_file = open(config_path, 'rb')
            pickle_load = pickle.load(config_file)
            i = 0
            row_list = []
            while i < len(pickle_load):
                if pickle_load[i] == 'water':
                    sql = 'SELECT [meterId], [meterDt],[rainAmount] FROM [water].[dbo].[rain] ' \
                          'WHERE meterDt<\'' + self.get_time('NOW') + '\' AND meterDt>=\'' + self.get_time('HOUR') + '\';'
                    status, row_list_rain = self.runsql(sql, 'water', 'rain')
                    if status == 0:
                        row_list = row_list + row_list_rain

                    sql = 'SELECT [meterId],[meterDt],[waterLv] FROM [water].[dbo].[waterLv] ' \
                          'WHERE meterDt<\'' + self.get_time('NOW') + '\' AND meterDt>=\'' + self.get_time('HOUR') + '\';'
                    status, row_list_waterlv = self.runsql(sql, 'water', 'waterLv')
                    if status == 0:
                        row_list = row_list + row_list_waterlv

                elif pickle_load[i] == 'STDDB_V380':
                    sql = 'SELECT [STCD],[TM],[DRP] FROM [STDDB_V380].[dbo].[ST_PPTN_R] ' \
                          'WHERE TM<\'' + self.get_time('NOW') + '\' AND TM>=\'' + self.get_time('HOUR') + '\';'
                    status, row_list_pptn = self.runsql(sql, 'STDDB_V380', 'ST_PPTN_R')
                    if status == 0:
                        row_list = row_list + row_list_pptn

                    sql = 'SELECT [STCD],[TM],[Z] FROM [STDDB_V380].[dbo].[ST_RIVER_R]' \
                          'WHERE TM<\'' + self.get_time('NOW') + '\' AND TM>=\'' + self.get_time('HOUR') + '\';'
                    status, row_list_river = self.runsql(sql, 'STDDB_V380', 'ST_RIVER_R')
                    if status == 0:
                        row_list = row_list + row_list_river

                    sql = 'SELECT [STCD],[TM],[RZ] FROM [STDDB_V380].[dbo].[ST_RSVR_R]' \
                          'WHERE TM<\'' + self.get_time('NOW') + '\' AND TM>=\'' + self.get_time('HOUR') + '\';'
                    status, row_list_rsvr = self.runsql(sql, 'STDDB_V380', 'ST_RSVR_R')
                    if status == 0:
                        row_list = row_list + row_list_rsvr
                i = i + 1
        except Exception as error:
            self.write_log('数据库查询总体上报错:\n' + repr(error))

        try:
            info_file = open('.//DATA//info.pik', 'rb')
            info_list = pickle.load(info_file)
        except Exception as error:
            self.write_log('得站点信息列表错误,info.pik已经存在:\n' + repr(error))

        try:
            now_hour = time.localtime().tm_hour
            info_list[0].append(str(now_hour - 1) + '时 至 ' + str(now_hour) + '时')
            i = 1
            while i < len(info_list):
                info_list[i][0]
                m = 0
                flag = 0
                while m < len(row_list):
                    if str(info_list[i][0][0]) == str(row_list[m][0]):
                        flag = 1
                        del row_list[m]
                        m = m - 1
                    m = m + 1
                if flag == 1:
                    info_list[i].append(1)
                else:
                    info_list[i].append(0)
                i = i + 1
        except Exception as error:
            print(repr(error))
            return 1

        try:
            info_list_file = open('.//DATA//info.pik', 'wb')
            pickle.dump(info_list, info_list_file)
            return 0
        except Exception as error:
            self.write_log('重新压入数据错误:' + repr(error))
            return 1
        finally:
            info_list_file.close()

    def send_email(self):
        # 发送邮件
        def _format_addr(s):
            name, addr = parseaddr(s)
            return formataddr((Header(name, 'utf-8').encode(), addr))

        self.write_log('准备发送邮件')
        file = open('.//DATA//info.pik', 'rb')
        info_list = pickle.load(file)
        msg_txt = '<html><body><table border="1" cellspacing="0" style="color:#FFF; text-align:left; ' \
                  'font-size:14px; font-weight:bold; margin-left:1px; width:1200px; height:200px;text-align:center">'
        i = 0
        while i < len(info_list):
            n = 0
            m = 0
            tr = '<tr>'
            while n < len(info_list[i]):
                if i == 0 or n == 0:
                    if m == 0:
                        tr = tr + '<td bgcolor="224071">%d</td><td bgcolor="224071">' % i + str(
                            info_list[i][n]) + '</td>'
                        m = m + 1
                    else:
                        tr = tr + '<td bgcolor="224071">' + str(info_list[i][n]) + '</td>'
                else:
                    if info_list[i][n] == 0:
                        tr = tr + '<td bgcolor="e91e6f">无数据</td>'
                    else:
                        tr = tr + '<td bgcolor="1ea27e">有数据</td>'
                n = n + 1
            tr = tr + '</tr>'
            m = 0
            msg_txt = msg_txt + tr
            i = i + 1
        msg_txt = msg_txt + '</table></body></html>'

        try:
            msg = MIMEText(msg_txt, 'plain', 'utf-8')
            from_addr = self.email_window.dir_email['user']
            password = self.email_window.dir_email['password']
            to_addrs = ''
            for line in self.email_window.list_users:
                to_addrs = to_addrs + line + ','
            stmp_server = self.email_window.dir_email['stmp']

            msg['From'] = _format_addr('%s<%s>' % (self.email_window.dir_email['user'],from_addr))
            msg['To'] = ','.join(to_addrs)
            msg['Subject'] = Header('%s%s邮件' % (self.email_window.dir_email['name'],self.get_time(), 'utf-8').encode())

            server = smtplib.SMTP(stmp_server, 25)
            server.set_debuglevel(1)
            server.login(from_addr, password)
            server.sendmail(from_addr, [to_addrs], msg.as_string())
            os.remove('.//DATA//info.pik')
            server.quit()
            return 0
        except Exception as error:
            self.write_log('邮件发送失败!\n' + repr(error))
            return 1
    def auto_start(self):
        if time.localtime().tm_min != 3:
            return
        self.write_log('------------------程序开始------------------')
        try:
            path_list = ['.//log', './/DATA']
            for dir_path in path_list:
                dir_path_num = self.path_exists(dir_path)
                if dir_path_num == 1:
                    pass
                elif dir_path_num == 0:
                    os.remove(dir_path)
                    os.mkdir(dir_path)
                else:
                    os.mkdir(dir_path)
            config_file = './/DATA//DBconfig.pik'
            config_file_num = self.path_exists(config_file)
            first_runsql_num = 9
            if config_file_num == 0:
                first_runsql_num = 2
            elif config_file_num == 1:
                os.remove(config_file)
                first_runsql_num = self.frist_runsql(config_file)
            else:
                first_runsql_num = self.frist_runsql(config_file)

            if first_runsql_num == 2 or first_runsql_num == 4:
                pass
            elif first_runsql_num > 4:
                os.remove('.//DATA//DBconfig.pik')
                self.write_log('DBconfig.pik有问题.程序终止运行.')
                return
            elif first_runsql_num == 0:
                self.write_log('数据库中不存在想要的数据库.')
                return
            else:
                self.write_log('DBconfig.pik有问题.程序终止运行.')
                return
        except Exception as error:
            self.write_log('执行错误')
            return
        try:
            run_sql_flag = self.run_sql()
            if run_sql_flag == 1:
                return
            if time.localtime().tm_hour == 8:
                if time.localtime().tm_min == 3:
                    i = 0
                    while i < 4:
                        flag = self.send_email()
                        if flag == 0:
                            i = 4
                            break
                        i = i + 1
                        time.sleep(300)
        except Exception as error:
            self.write_log('最后一段时间错误:\n' + repr(error))




if __name__ == '__main__':
    if not os.path.exists('.//DATA'):
        os.mkdir('.//DATA')
    app = QApplication(sys.argv)
    mainwin = mainwindows()
    sys.exit(app.exec_())


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

pyqt5_站点管理_WaterClient_1

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

jspXCMS站点怎么管理

这篇文章主要介绍“jspXCMS站点怎么管理”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“jspXCMS站点怎么管理”文章能帮助大家解决问题。Jspxcms支持多组织独立管理的站群,各个子站可以有自
2023-06-26

解锁网站管理新境界:多站点管理的艺术

多站点管理是网站管理的更高境界,它可以帮助企业和站长管理多个网站,并实现集中管理和高效运维。
解锁网站管理新境界:多站点管理的艺术
2024-02-03

多站点管理:轻松管理网站,释放数字潜力

多站点管理是一种强大的技术,允许您从一个中央位置管理多个网站。在本文中,我们将探讨多站点管理的优势,并提供一些关于如何实现它的建议。
多站点管理:轻松管理网站,释放数字潜力
2024-02-03

如何在DW CS6中新建站点并管理站点

这篇文章主要介绍“如何在DW CS6中新建站点并管理站点”,在日常操作中,相信很多人在如何在DW CS6中新建站点并管理站点问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”如何在DW CS6中新建站点并管理站点
2023-06-08

打造网站管理效率新体验:多站点管理的魅力

多站点管理系统提供集中管理多站点的方式,实现对站点内容、用户、权限和数据进行统一管理。它可以有效提高管理效率,降低管理成本,并增强网站安全性。 多站点管理系统,WordPress,多站点网络,多站点托管
打造网站管理效率新体验:多站点管理的魅力
2024-02-03

多站点管理:全面提升网站管理水平,开创新局面

多站点管理是一种先进的网站管理技术,它可以帮助网站管理员轻松管理多个网站,提高工作效率,开创网站管理的新局面。
多站点管理:全面提升网站管理水平,开创新局面
2024-02-03

多站点管理:打造高效网站管理流程,助力业务腾飞

本文概述:多站点管理是企业网站管理中的一项重要任务,旨在高效管理多个网站,确保其安全性和可用性。本文介绍了如何构建强大的多站点管理流程,以提高网站管理效率,助力业务腾飞。
多站点管理:打造高效网站管理流程,助力业务腾飞
2024-02-03

多站点管理:步入管理网站的新时代,成就事业辉煌

多站点管理是一种强大且高效的方法,可让您轻松地管理和控制多个网站。本文将介绍多站点管理的优势,并提供一个有关如何使用 WordPress 管理多个网站的示例。
多站点管理:步入管理网站的新时代,成就事业辉煌
2024-02-03

jspXCMS站点管理的方法是什么

这篇文章主要介绍“jspXCMS站点管理的方法是什么”,在日常操作中,相信很多人在jspXCMS站点管理的方法是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”jspXCMS站点管理的方法是什么”的疑惑有所
2023-06-26

多站点管理:解锁网站管理的新篇章,引领数字化变革

多站点管理作为一种先进的网站管理技术,通过集中化的控制,简化了多个网站的管理流程,优化了资源利用率,为企业带来了巨大的管理便利,并提升了数字化效率,助力企业迈向更高层次的发展。
多站点管理:解锁网站管理的新篇章,引领数字化变革
2024-02-03

多站点管理:掌控多重网站,纵横网络世界

多站点管理是一种可以同时管理多个网站的强大技术,它可以帮助企业和个人轻松管理多个网站,并提高网站的效率和安全性。
多站点管理:掌控多重网站,纵横网络世界
2024-02-03

phpStudy V8中创建与管理站点的实例

小编给大家分享一下phpStudy V8中创建与管理站点的实例,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!1. 站点的创建选择[网站], 点击左上角的[创建网站
2023-06-07

多站点管理:简化多个网站运营的终极指南

多站点管理是一种强大的工具,可让您有效管理多个网站,简化运营流程,提高工作效率。
多站点管理:简化多个网站运营的终极指南
2024-02-03

Apache如何实现多站点的配置和管理

Apache可以利用VirtualHost来实现多站点的配置和管理。VirtualHost允许在同一台服务器上托管多个域名或站点,并为每个站点提供独立的配置。要配置VirtualHost,首先需要在Apache的配置文件中添加如下配置:
Apache如何实现多站点的配置和管理
2024-07-05

阿里云ECS单个站点日志解析及管理

随着云计算技术的快速发展,阿里云ECS(ElasticComputeService)已经成为众多企业的重要选择。然而,随着ECS的使用,单个站点日志的管理和解析也成为了企业面临的一大挑战。本篇文章将详细介绍如何通过阿里云的ECS服务,对单个站点的日志进行管理与解析。一、阿里云ECS的简介阿里云ECS是一款基于云计
阿里云ECS单个站点日志解析及管理
2023-12-17

多站点管理:让您的在线帝国井然有序

了解了多站点管理的利弊,该指南将介绍如何设置多站点网络并管理多个网站。
多站点管理:让您的在线帝国井然有序
2024-02-03

编程热搜

目录