一、需求
有大屏需要按照配置文件显示多个VNC,Chrome;主要依赖第三方库如下
configparser#解析ini配置文件
pywinauto#Python自动化桌面办公第三方库
schedule#Python定时任务框架
pyinstaller#用来将Python文件打包成exe
二、前置条件
- VNC可通过CMD如下命令打开之前保存的远程地址:
start C:\Program" "Files\RealVNC\VNC4\vncviewer.exe -config D:\data\vnc\10.31.15.98.vnc
- 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"
三、主要类介绍
- autoIt.ini自定义的配置文件,定义需要打开VNC,还是浏览器;
- Props.py与配置文件配套使用的模型类;
- main.py读取autoIt.ini配置文件,按照配置文件中的appType打开vnc,还是Chrome;
- VNC.py打开对应VNC,按照appName(vnc主机名)设置位置、大小
- Browser.py打开chrome ,并通过
C:/temp/Chrome/1
设置每个网址打开不通的Chrome,设置位置大小
四、具体代码
- 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
- 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 )
- 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()
- 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()
- 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自动运行;
- 使用Python虚拟环境,好处是可按需安装依赖库,避免一些库无法被打包导致打包失败;
首先,我们安装一下pipenv这个包,方便我们创建虚拟环境:
pip install pipenv
- 然后执行如下命令建立虚拟环境:
pipenv install
- 接着执行如下命令进入虚拟环境:
pipenv shell
- 安装需要的包
pip install configparser#解析ini配置文件
pip install pywinauto#Python自动化桌面办公第三方库
pip install schedule#Python定时任务框架
pip install pyinstaller#用来将Python文件打包成exe
- 运行打包命令
pyinstaller -F main.py
-
打包结果
在python工程目录文件夹下生成如下两个文件夹,生成的exe位于dist文件夹下
企业微信截图_16414528311025.png - 将exe加入Windows开启启动项
按下win+r打开Windows运行框输入shell:startup
打开Windows启动项文件夹
企业微信截图_16414529054082.png -
将第6步生成的exe右键,生成快捷方式,将该快捷方式放入第7步打开的文件夹内,即可实现开机自动启动
企业微信截图_1641453203369.png
网友评论