Python+QT5小工具开发:subprocess.Popen执行adb命令获取截图

本文介绍了一个使用Python和QT实现的手机截图工具,通过ADB命令完成截图并保存到指定路径。适用于需要快速获取手机屏幕快照的场景。
部署运行你感兴趣的模型镜像

一:使用工具

Python3.7+QT5

二:直接上代码,因为我是无私奉献的人。

    #手机截图
    def screencap(self):
        file_path = QFileDialog.getSaveFileName(self, "保存截图", "./","png files (*.png);;jpg files (*.jpg);;all files(*.*)")
        #截图名字
        screencap_name = os.path.split(file_path[0])[1]
        #截图目录
        screencap_path = os.path.split(file_path[0])[0]
        screencapCmd1 = 'adb shell screencap -p /sdcard/'+ screencap_name
        screencapCmd2 = 'adb pull /sdcard/' +screencap_name+' '+screencap_path
        if len(str(file_path[0])) > 0:
            # 启动线程
            threading.Thread(target=self.screencap_handle, args=(screencapCmd1,screencapCmd2,file_path[0],)).start()
        else:
            self.screencap_path.setText('截图保存路径:请选择路径')

    def screencap_handle(self,screencapCmd1,screencapCmd2,file_path):
        #判断是否连接手机
        list2 = ''
        ps = subprocess.Popen(self.deviceNameCmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,
                         shell=False)
        with ps:
            for line in ps.stdout:
                list2 = list2+(line.decode("utf-8"))
            adb_result = list2.replace('\n','').replace('\r','')
            if(len(adb_result.split()))>4:
                self.screencap_path.setText('截图保存路径:' + str(file_path))
                subprocess.Popen(screencapCmd1, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=False)
                sleep(1)
                subprocess.Popen(screencapCmd2, stdin=subprocess.PIPE, stdout=subprocess.PIPE, stderr=subprocess.PIPE,shell=False)
            else:
                self.screencap_path.setText('截图保存路径:请连接手机')

三:运行效果

点击一键截图按钮,然后选择保存文件,亲测有效。

您可能感兴趣的与本文相关的镜像

Python3.9

Python3.9

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

import json import datetime import os from qfluentwidgets import InfoBar import re import subprocess from PyQt5.QtWidgets import QApplication, QWidget def get_adb_devices(): # 执行adb命令获取输出 result = subprocess.run(['adb', 'devices'], capture_output=True, text=True) devices = [] # 按行解析,跳过表头和空行 for line in result.stdout.splitlines(): if 'List of devices' in line or line.strip() == '': continue serial = line.split('\t')[0] devices.append(serial) return devices def deviceList(): deviceListid = get_adb_devices() return deviceListid def get_Apks_Version(device) -> list: """ 获取APK版本 :param device: 设备号 :return: APK包名和版本列表 """ apksVersion = [] cmd_packages_res = subPopen(f"adb -s {device} shell pm list packages") packages = re.findall(r'package:(.*?)\r\n', cmd_packages_res) for package in packages: cmd_version_res = subPopen(f"adb -s {device} shell dumpsys package {package} | findstr versionName") if re.findall(r'versionName=(.*?)\r\n', cmd_version_res): version = re.findall(r'versionName=(.*?)\r\n', cmd_version_res)[0] else: version = "null" apksVersion.append({ package: version }) return apksVersion def subPopen(cmd: str, **kwargs): """ 执行终端指令,并返回结果 :param cmd: 指令 :return: 结果 """ cmd_pipe = subprocess.Popen(cmd, shell=True, stderr=subprocess.PIPE, stdout=subprocess.PIPE) cmd_res = cmd_pipe.stdout.read().decode(**kwargs) return cmd_res class TestDataExporter(QWidget): def __init__(self): super().__init__() # 初始化设备列表和版本号(需补充实际获取逻辑) self.deviceList = ["设备1", "设备2"] # 示例数据,替换为实际ADB获取代码 self.get_Apks_Version = "1.0.0" # 示例数据,替换为实际版本获取代码 def main(self): """导出测试数据""" try: testData = { "commandCmd": "", "customerName": "", "hwVersion": "", "deviceNum": len(self.deviceList), "deviceIds": self.deviceList, "apksVersion": self.get_Apks_Version } # 确保目录存在 if not os.path.exists("TestData"): os.makedirs("TestData") # 生成文件名 testDataFile = "TestData@{}".format( datetime.datetime.now().strftime("%Y-%m-%d_%H%M%S.json") ) # 写入文件 with open(os.path.join("TestData", testDataFile), 'w', encoding='utf-8') as fp: json.dump(testData, fp, ensure_ascii=False, indent=4) InfoBar.success( title="Success", content="测试数据已导出", duration=2000, parent=self ) except Exception as e: InfoBar.error( title="Error", content="测试数据导出失败", duration=2000, parent=self ) print(f"错误详情: {str(e)}") # 实际使用时替换为日志记录 # 测试代码 if __name__ == '__main__': exporter = TestDataExporter() # 实例化类 exporter.main() # 调用实例方法, 需求:精简代码,实现数据导出
04-02
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值