Python +Qt 实现Simulator(升级版本)

本文是《Python + Qt 实现Simulator》的升级版本,介绍如何使用Python和Qt来增强Simulator的功能。内容包括:main.py、Armulator.py、adb.py、android_keycode.py和QssHelper.py等文件的更新,以实现更先进的模拟效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在<Python +Qt 实现Simulator>这篇文章中介绍了Python +Qt 实现simulator的功能,此篇为升级版本.
先看实现的效果:
在这里插入图片描述
main.py

#encoding=UTF-8
import traceback,re
import subprocess,os,sys

class ADB:
    def __init__(self, device=None):
        self.active_device = device
        self.devices_list =[]
        self.wm_size = ()
        
    def shell(self, cmd=None, cmd_type="shell", device=None):
        if not device:
            device = self.active_device
            if not device:
                print("No adb device!")
                return
        
        adb_shell = "adb  -s {} {}".format(device, cmd_type) if device else "adb {}".format(cmd_type) 
        shell_cmd = "{} {}".format(adb_shell, cmd)
        print("[IN]: {}".format(shell_cmd))
        result  = os.popen(shell_cmd).read()
        print("[OUT]: {}".format(result))
        return result
    
    def sendCmd(self, cmd):
        cmd = cmd.lower().strip()
        ptn1 = re.compile(r'^adb\s+-s\s') 
        ptn2 = re.compile(r'^adb\s+')
        mch1 = ptn1.match(cmd)
        mch2 = ptn2.match(cmd)
        cmd_exec = ""
        if mch1:
            cmd_exec = cmd
        elif mch2:
            cmd_exec = "adb -s {} {}".format(self.active_device, cmd[len(mch2.group()):])
        else:
            if -1 != cmd.find("device"):
                print("Please not use 'device' cmd!")
                return
            else:
                cmd_exec = "adb -s {} {}".format(self.active_device, cmd)
        pos = cmd_exec.find("shell")
        if -1 != pos and pos==(len(cmd_exec)-len("shell")):
            print("Please not use 'shell' cmd!")
            return 
        
        print("[IN]: {}".format(cmd_exec))
        result  = os.popen(cmd_exec).read()
        print("[OUT]: {}".format(result))
        return result
    
    def setDevice(self, device):
        self.active_device = device
        
    def scanDevices(self):
        process = subprocess.Popen("adb devices", shell=True, stdout=subprocess.PIPE)
        b_str = process.stdout.read()
        b_str.replace(b'\r\n', b'\n')
        out_str = str(b_str, encoding='UTF-8')
        line_list = out_str.splitlines()
        if not line_list:
            print('adb不可用!!!')
            return None
        
        if len(line_list) < 3:
            print('未发现adb设备!!!')
            return None
        else:
            print('检测到的adb设备为:')
            devices_list = []
            for line in line_list[1:]:
                print(line)
                if line.strip():
                    devices_list.append(line)
            self.devices_list = devices_list
            return self.devices_list
    
    def adbAvailable(self):
        return self.devices_list is not None
    
    def deviceList(self):
        return self.devices_list
    
    def screenSize(self, device=None):
        if  device != self.active_device:
            device = self.active_device
            
            adb_shell = "adb  -s {} shell".format(device) if device else "adb shell" 
            screen_size_cmd = '{} wm size'.format(adb_shell)
            size_str = os.popen(screen_size_cmd).read()
            try:
                size_wh = size_str.split(":")[1].strip()
                w,h = size_wh.split("x")
                return (int(w),int(h))
            except Exception as e:
                print(e)
                traceback.print_exc()
                return None
        else:
            return self.wm_size
        
    def deviceName(self, device=None):
        if not device:
            device = self.active_device
            
        adb_shell = "adb  -s {} shell".format(device) if device else "adb shell" 
        device_cmd = '{} getprop ro.product.model'.format(adb_shell)

        device_str = os.popen(device_cmd).read()
        return device_str.strip()
    
    def deviceInfo(self, device=None):
        if not device:
            device = self.active_device
            
        adb_shell = "adb  -s {} shell".format(device) if device else "adb shell" 
        screen_size_cmd = '{} wm size'.format(adb_shell)
        device_cmd = '{} getprop ro.product.model'.format(adb_shell)
        density_cmd = '{} wm density'.format(adb_shell)

        size_str = os.popen(screen_size_cmd).read()
        device_str = os.popen(device_cmd).read()
        density_str = os.popen(density_cmd).read()
        device_info = ("{size}\n{dpi}\nDeviceType: {type}".format(
                size=size_str.strip(),
                type=device_str.strip(),
                dpi=density_str.strip()
                 )
        )
        
        try:
            size_wh = size_str.split(":")[1].strip()
            w,h = size_wh.split("x")
            self.wm_size = (
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值