在<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 = (