栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

阿雪的学习记录|Python写个点击器及grab()截图不全解决办法

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

阿雪的学习记录|Python写个点击器及grab()截图不全解决办法

因为菜的调不出软件的界面控制端口,或者说真的有这种东西嘛!一直找不到……只能用sdk但是sdk没办法输出图形界面能输出的那种文件,要不就是我太菜了所以不会输出,所以做了个点击器……虽然做了出来但是不知道为什么我想控制的软件依然没办法点击,电脑上其他软件和程序都可以点,就这个点不动

为你弹奏python的夜曲,纪念我死去的激情……

from time import sleep
import time
import pyautogui
from PIL import ImageGrab, Image
import pyscreeze
import cv2
import matplotlib.pyplot as plt 
import numpy as np

# 屏幕缩放系数 mac缩放是2 windows一般是1
screenScale=1

#事先读取按钮截图
target= cv2.imread(r"C:UsersxxxDesktoppython11.png",cv2.IMREAD_COLOR)

img = ImageGrab.grab()

img.save('my_screenshot.png')

# 读取图片
temp = cv2.imread(r'my_screenshot.png',cv2.IMREAD_COLOR)

theight, twidth = target.shape[:2]
tempheight, tempwidth = temp.shape[:2]
print("目标图宽高:"+str(twidth)+"-"+str(theight))
print("模板图宽高:"+str(tempwidth)+"-"+str(tempheight))
# 先缩放屏幕截图 INTER_LINEAR INTER_AREA
scaleTemp=cv2.resize(temp, (int(tempwidth / screenScale), int(tempheight / screenScale)))
stempheight, stempwidth = scaleTemp.shape[:2]
print("缩放后模板图宽高:"+str(stempwidth)+"-"+str(stempheight))
# 匹配图片
res = cv2.matchTemplate(scaleTemp, target, cv2.TM_CCOEFF_NORMED)
mn_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
if(max_val>=0.8):
	# 计算出中心点
    top_left = max_loc
    bottom_right = (top_left[0] + twidth, top_left[1] + theight)
    tagHalfW=int(twidth/2)
    tagHalfH=int(theight/2)
    tagCenterX=top_left[0]+tagHalfW
    tagCenterY=top_left[1]+tagHalfH
    #左键点击屏幕上的这个位置
    pyautogui.click(tagCenterX,tagCenterY,button='left')
    time.sleep(3)	#睡了三秒
    #双击,这是我最后的倔强,然鹅我想控制的界面双击也点不动,毁灭吧
    #还有其他的鼠标响应功能,可以去pyautogui的官方网站自查,四级不过也看得懂
    pyautogui.doubleClick(tagCenterX,tagCenterY,button='left')
else:
    print ("没找到")

在运行这个程序的时候出现了一个问题,就是在img = ImageGrab.grab()这条代码运行之后,按理说会截取整个电脑的屏幕,然而截出来的图片是一部分屏幕,但是它目标按钮识别匹配是没问题的,鼠标也确实移动了,移动到的位置虽然在自己屏幕上看是错的,但是按照它截的屏幕图来看,就是对的,查了很多资料,有说现在电脑显示比例自动是150%,改成100%就可以,可是100%的话根本看不清,而且好像还是截出来不全的图?
最后找到了这个方法,来源我忘了等找到就补上,python运行以下代码:

from PIL import ImageGrab
import winreg

reg = winreg.ConnectRegistry(None, winreg.HKEY_CURRENT_USER)
key = winreg.OpenKey(reg, r'Control PanelDesktopWindowMetrics')
# print(winreg.QueryValueEx(key, 'AppliedDPI'))
if winreg.QueryValueEx(key, 'AppliedDPI')[0] != 96:
    key.Close()
    key = winreg.OpenKey(reg, r'SOFTWAREMicrosoftWindows NTCurrentVersionAppCompatFlagsLayers', 0, winreg.KEY_ALL_ACCESS)
#前面的两个地址都不用改,下面这两个地址改成自己对应的python.exe和pythonw.exe的地址就行了
    winreg.SetValueEx(key, r'C:softwareAnaconda3pythonw.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE')
    winreg.SetValueEx(key, r'C:softwareAnaconda3python.exe', 0, winreg.REG_SZ, 'HIGHDPIAWARE')
key.Close()
reg.Close()

#下面这三行就是截图然后保存,不写也行,反正上面就是配置注册表的代码,程序一键配置美吱吱
pic = ImageGrab.grab()
# print(pic.size)
pic.save(r'C:UsersxxxDesktoppic.jpg')

就在IDE里运行就行,不返回错误就是配置成功了,再grab就是完整的屏幕了

对了,点击器在运行的时候,目标按钮,也就是我第一块代码里的11.png这个图需要是原大小,可以ctrl+prtsc之后粘贴到word里,然后把需要的按钮部分裁剪出来,这个时候需要注意粘贴到word里的截图是有缩放比例的,裁剪完之后把比例改成100%,再把这图另存到路径里就能用了。
就很讨厌,我电脑上所有软件都能控制,就只有我想控制的不能!我甚至可以用这个再多写两行条件语句自动玩4399小游戏……我不理解,intel怎么回事,你们的界面完全没有开放接口的嘛必须要真实的鼠标点击才能响应嘛甚至连键盘快捷键都没有,难道是用鼠标的弹簧来控制按钮的吗!骂骂咧咧走了

每天学一点点,就能少菜一点点,加油( •̀ ω •́ )y

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1022919.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号