美文网首页
大屏与监控屏使用pywinauto自动打开VNC和Chrome并

大屏与监控屏使用pywinauto自动打开VNC和Chrome并

作者: 卢二牛 | 来源:发表于2022-01-06 15:13 被阅读0次

    一、需求

    有大屏需要按照配置文件显示多个VNC,Chrome;主要依赖第三方库如下

    configparser#解析ini配置文件
    pywinauto#Python自动化桌面办公第三方库
    schedule#Python定时任务框架
    pyinstaller#用来将Python文件打包成exe
    

    二、前置条件

    VNC介绍

    1. VNC可通过CMD如下命令打开之前保存的远程地址:
    start C:\Program" "Files\RealVNC\VNC4\vncviewer.exe -config D:\data\vnc\10.31.15.98.vnc
    
    1. Chrome可通过如下命令打开对应的界面,并设置位置;Chrome参数介绍
    start C:\Program" "Files\Google\Chrome\Application\chrome.exe www.baidu.com --window-position=100,100 --window-size=300,200 --user-data-dir="C:/temp/Chrome/1"
    

    三、主要类介绍

    1. autoIt.ini自定义的配置文件,定义需要打开VNC,还是浏览器;
    2. Props.py与配置文件配套使用的模型类;
    3. main.py读取autoIt.ini配置文件,按照配置文件中的appType打开vnc,还是Chrome;
    4. VNC.py打开对应VNC,按照appName(vnc主机名)设置位置、大小
    5. Browser.py打开chrome ,并通过C:/temp/Chrome/1设置每个网址打开不通的Chrome,设置位置大小

    四、具体代码

    1. autoIt.ini自定义的配置文件,定义需要打开VNC,还是浏览器;
    [section1]
    ;新的监控屏幕叫section1,不可重复
    appCmd =C:\Program Files\RealVNC\VNC4\vncviewer.exe -config D:\data\vnc\10.31.15.98.vnc
    appName =ZS-TEST-98
    ;appName代表VNC主机名
    appX=100
    appY=200
    appW=300
    appH=200
    appTpe=vnc
    ;appType的取值范围browser|vnc
    [section2]
    ;新的监控屏幕叫section1,不可重复
    appCmd =C:\Program Files\RealVNC\VNC4\vncviewer.exe -config D:\data\vnc\10.31.15.98.vnc
    appName =ZS-TEST-98
    appX=400
    appY=200
    appW=300
    appH=200
    appTpe=vnc
    ;appType的取值范围browser|vnc
    [section3]
    ;新的监控屏幕叫section1,不可重复
    appCmd =C:\Program Files\Google\Chrome\Application\chrome.exe www.baidu.com
    appName =ZS-TEST-99
    ;浏览器appName未使用,可随意命名
    appX=400
    appY=400
    appW=300
    appH=600
    appTpe=browser
    ;appType的取值范围browser|vnc
    [section4]
    ;新的监控屏幕叫section1,不可重复
    appCmd =C:\Program Files\Google\Chrome\Application\chrome.exe www.baidu.com
    appName =ZS-TEST-99
    appX=700
    appY=400
    appW=300
    appH=600
    appTpe=browser
    ;appType的取值范围browser|vnc
    
    1. Props.py与配置文件配套使用的模型类;
    # -*- coding: utf-8 -*-
    class Props:
        appCmd = "";
        appName = "";
        appX = 0;
        appY = 0;
        appW = 0;
        appH = 0;
        appType = "";#browser|vnc
        def __init__(self,appCmd,appName,appX,appY,appW,appH,appType):
            self.appCmd = appCmd;
            self.appName = appName;
            self.appX = appX;
            self.appY = appY;
            self.appW = appW;
            self.appH = appH;
            self.appType = appType;
    
        def __str__(self) -> str:
            return  'Props (%s, %s, %d,%d,%d,%d,%s)' % (self.appCmd, self.appName,self.appX ,self.appY ,self.appW ,self.appH,self.appType )
    
    1. main.py读取autoIt.ini配置文件,按照配置文件中的appType打开vnc,还是Chrome;
    # -*- coding: utf-8 -*-
    import configparser
    import schedule
    from Browser import Browser
    from Props import Props
    from VNC import VNC
    
    
    def readConf():
        config = configparser.ConfigParser()  # 类实例化
        config.read(r"D:\data\autoIt.ini",encoding="utf8")
        sections = config.sections()
        props = []
        for section in sections:
            appCmd = config.get(section, 'appCmd')
            appName = config.get(section, 'appName')
            appX = int(config.get(section, 'appX'))
            appY = int(config.get(section, 'appY'))
            appW = int(config.get(section, 'appW'))
            appH = int(config.get(section, 'appH'))
            appTpe = config.get(section, 'appTpe')
            prop = Props(appCmd,appName,appX,appY,appW,appH,appTpe)
            props.append(prop)
        return props
    def Bloom():
        props = readConf()
        browser = Browser()
        app = VNC()
        browser.close()
        app.close()
        i = 0;
        for prop in props:
            i = i + 1
            if (prop.appType == "browser"):
                browser.run(prop.appCmd, prop.appX, prop.appY, prop.appW, prop.appH, i)
            else:
                app.start(prop.appCmd, prop.appName, prop.appX, prop.appY, prop.appW, prop.appH)
    if __name__ ==  "__main__":
        Bloom()
        schedule.every(1).hours.do(Bloom)
        while True:
            schedule.run_pending()
    
    1. VNC.py打开对应VNC,按照appName(vnc主机名)设置位置、大小
    # -*- coding: utf-8 -*-
    import os
    
    from pywinauto import application
    import time
    
    
    class VNC(object):
        """
        pywin framwork main class
        tool_name : 程序名称,支持带路径
        windows_name : 窗口名字
        """
        SLEEP_TIME = 1
    
        def __init__(self):
            """
            初始化方法,初始化一个app
            """
            self.app = application.Application()
    
    
        def run(self, tool_name):
            """
            启动应用程序
            """
            self.app.start(tool_name)
            time.sleep(1)
        def max_window(self, window_name):
            """
            最大化窗口
            """
            self.app[window_name].Maximize()
            time.sleep(1)
        def move_window(self,window_name,x = None, y = None, width = None, height = None):
            self.app[window_name].move_window(x,y,width,height)
            time.sleep(1)
    
        def close(self):
            os.system(f"taskkill /t /f /im vncviewer.exe")
            time.sleep(1)
        def start(self,appCmd,appName,appX,appY,appW,appH):
            self.run(appCmd)
            self.move_window(appName,appX,appY,appW,appH)
    if __name__ ==  "__main__":
        app = VNC()
        # 启动程序
        app.run(r"C:\Program Files\RealVNC\VNC4\vncviewer.exe -config D:\data\vnc\10.31.15.98.vnc")
        app.move_window("ZS-TEST-98",100,200,300,400)
        app.close()
    
    
    1. Browser.py打开chrome ,并通过C:/temp/Chrome/1设置每个网址打开不通的Chrome,设置位置大小
    # -*- coding: utf-8 -*-
    import os
    import time
    from pywinauto import application
    class Browser(object):
        """
           pywin framwork main class
           tool_name : 程序名称,支持带路径
           windows_name : 窗口名字
           """
        SLEEP_TIME = 1
    
        def __init__(self):
            """
            初始化方法,初始化一个app
            """
            self.app = application.Application()
    
        def run(self, tool_name):
            """
            启动应用程序
            """
            self.app.start(tool_name)
            time.sleep(1)
        def run(self,appCmd,appX,appY,appW,appH,dir):
            position = " --window-position="+str(appX)+","+str(appY)
            size = " --window-size=" + str(appW) + "," + str(appH)
            tmpDir = "C:/temp/Chrome/"+str(dir)
            userDir = " --user-data-dir="+tmpDir
            self.app.start(appCmd+position+size+userDir)
        def close(self):
            os.system(f"taskkill /t /f /im chrome.exe")
            time.sleep(1)
    if __name__ ==  "__main__":
        browser = Browser()
    
        browser.run(r"C:\Program Files\Google\Chrome\Application\chrome.exe www.baidu.com",100,200,300,400,3)
    

    五、优化需求

    使用pyinstaller将代码打包成exe,实现点击exe自动运行;

    1. 使用Python虚拟环境,好处是可按需安装依赖库,避免一些库无法被打包导致打包失败;
      首先,我们安装一下pipenv这个包,方便我们创建虚拟环境:
    pip install pipenv
    
    1. 然后执行如下命令建立虚拟环境:
    pipenv install
    
    1. 接着执行如下命令进入虚拟环境:
    pipenv shell
    
    1. 安装需要的包
    pip install configparser#解析ini配置文件
    pip install pywinauto#Python自动化桌面办公第三方库
    pip install schedule#Python定时任务框架
    pip install pyinstaller#用来将Python文件打包成exe
    
    1. 运行打包命令
    pyinstaller -F main.py 
    
    1. 打包结果
      在python工程目录文件夹下生成如下两个文件夹,生成的exe位于dist文件夹下


      企业微信截图_16414528311025.png
    2. 将exe加入Windows开启启动项
      按下win+r打开Windows运行框输入shell:startup打开Windows启动项文件夹
      企业微信截图_16414529054082.png
    3. 将第6步生成的exe右键,生成快捷方式,将该快捷方式放入第7步打开的文件夹内,即可实现开机自动启动


      企业微信截图_1641453203369.png

    相关文章

      网友评论

          本文标题:大屏与监控屏使用pywinauto自动打开VNC和Chrome并

          本文链接:https://www.haomeiwen.com/subject/gvtrcrtx.html