# main.py
import sys
import threading
import cv2
import numpy as np
import pyautogui
import time
from PIL import ImageGrab
import logging
from PyQt5 import QtWidgets
from qt_material import apply_stylesheet
from main_window import Ui_Form
# 读取目标图片
image_message = cv2.imread('message.png')
image_login = cv2.imread('login.png')
h1, w1, _ = image_message.shape
h2, w2, _ = image_login.shape
threshold = 0.6
run_flag = False
labelEdit = None
errorNum = 0
# 子线程
class start_threading:
def __init__(self):
self.image = None
self.run()
def find(self, image):
self.image = image
screenshot = None
# 获取屏幕截图
# screenshot = ImageGrab.grab()
try:
screenshot = ImageGrab.grab()
except OSError as OSE:
print(f'[{self.get_time()}] {OSE}')
except Exception as other_err:
print(f'[{self.get_time()}] {other_err}')
# screenshot.save(f'src/{self.get_time()}.png')
if screenshot is None:
return [-1, -1]
screenshot = np.array(screenshot)
# 在屏幕截图上搜索目标图片
result = cv2.matchTemplate(screenshot, image, cv2.TM_CCOEFF_NORMED)
loc = np.where(result >= threshold)
if len(loc[0]) > 0 and len(loc[1]) > 0:
return [loc[1][0], loc[0][0]]
else:
return [0, 0]
def get_time(self):
now = time.strftime('%Y-%m-%d %H-%M-%S', time.localtime())
return now
def run(self):
try:
while True:
global run_flag, errorNum
while run_flag:
now = self.get_time()
set_label_text(f'[{now}]\nchecking...\nerrorNum: {errorNum}')
print(f'[{now}]\n checking...')
x, y = self.find(image_message)
if x == 0:
# print(f' running normally!')
pass
elif x < 0:
set_label_text(f'[{self.get_time()}] 截图失败!')
# print(f'[{self.get_time()}] screen grab failed')
else:
errorNum = errorNum + 1
now = self.get_time()
set_label_text(f'[{now}]\n Error! Enable automated scripts...')
# print(f'[{now}]\n Error! Enable automated scripts...')
time.sleep(1)
# print(f'[message_pos]: {x},{y}')
pyautogui.click(x + w1 // 2, y + h1 // 2)
time.sleep(1)
while run_flag:
x, y = self.find(image_login)
if x == 0:
now = self.get_time()
set_label_text(f'[{now}]\nError!\ncant not find login button!\ntrying again...')
# print("Error! can't not find login! trying again...")
time.sleep(3)
else:
time.sleep(1)
# print(f'[login_pos]: {x},{y}')
pyautogui.click(x + w2 // 2, y + h2 // 2)
now = self.get_time()
set_label_text(f'[{now}]\nSuccess!\nAutomation script completed.')
# print("Success! Automation script completed.")
break
time.sleep(3)
time.sleep(3)
except OSError as OSE:
set_label_text(f'系统错误: {OSE}')
print(f'[{self.get_time()}]系统错误: {OSE}')
except Exception as other_error:
now = self.get_time()
set_label_text(f'{now}未知错误\n:{other_error}')
print(f'{now}未知错误\n:{other_error}')
finally:
print("STOP")
# 主窗口
class MainWindow(QtWidgets.QWidget, Ui_Form):
def __init__(self):
super(MainWindow, self).__init__()
self.setupUi(self)
global labelEdit
labelEdit = self.label
apply_stylesheet(app, theme='dark_teal.xml')
def click_start_button(self):
global run_flag
if run_flag:
run_flag = False
self.startButton.setText("RESTART")
self.label.setText("Click button to start.")
else:
run_flag = True
self.startButton.setText("STOP")
self.label.setText("Running...\n")
thread = threading.Thread(target=start_threading)
def set_label_text(message):
labelEdit.setText(message)
if __name__ == '__main__':
app = QtWidgets.QApplication(sys.argv)
# 开启检测子线程
thread.daemon = True
thread.start()
test_ui = MainWindow()
test_ui.show()
sys.exit(app.exec_())
# main_window.py
from PyQt5 import QtCore, QtGui, QtWidgets
class Ui_Form(object):
def setupUi(self, Form):
Form.setObjectName("AutoLogin")
Form.resize(300, 250)
Form.setMinimumSize(QtCore.QSize(300, 250))
Form.setMaximumSize(QtCore.QSize(300, 250))
font = QtGui.QFont()
font.setFamily("微软雅黑")
font.setPointSize(12)
Form.setFont(font)
Form.setContextMenuPolicy(QtCore.Qt.NoContextMenu)
self.verticalLayoutWidget = QtWidgets.QWidget(Form)
self.verticalLayoutWidget.setGeometry(QtCore.QRect(0, 0, 311, 261))
self.verticalLayoutWidget.setObjectName("verticalLayoutWidget")
self.verticalLayout = QtWidgets.QVBoxLayout(self.verticalLayoutWidget)
self.verticalLayout.setContentsMargins(0, 0, 0, 0)
self.verticalLayout.setObjectName("verticalLayout")
self.label = QtWidgets.QLabel(self.verticalLayoutWidget)
self.label.setMinimumSize(QtCore.QSize(0, 180))
self.label.setAlignment(QtCore.Qt.AlignCenter)
self.label.setObjectName("label")
self.verticalLayout.addWidget(self.label)
spacerItem = QtWidgets.QSpacerItem(20, 25, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Maximum)
self.verticalLayout.addItem(spacerItem)
self.startButton = QtWidgets.QPushButton(self.verticalLayoutWidget)
self.startButton.setMinimumSize(QtCore.QSize(130, 0))
self.startButton.setMaximumSize(QtCore.QSize(150, 16777215))
self.startButton.setObjectName("startButton")
self.verticalLayout.addWidget(self.startButton, 0, QtCore.Qt.AlignHCenter)
spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding)
self.verticalLayout.addItem(spacerItem1)
self.retranslateUi(Form)
self.startButton.clicked.connect(Form.click_start_button) # type: ignore
QtCore.QMetaObject.connectSlotsByName(Form)
def retranslateUi(self, Form):
_translate = QtCore.QCoreApplication.translate
Form.setWindowTitle(_translate("Form", "AutoLogin"))
self.label.setText(_translate("Form", "Click to Start."))
self.startButton.setText(_translate("Form", "Start"))