Python - Esperar hasta poder ejecutar

 
Vista:
Imágen de perfil de Fernando
Val: 34
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Esperar hasta poder ejecutar

Publicado por Fernando (14 intervenciones) el 08/11/2019 06:58:15
Buenas,

Me he hecho un programilla para iniciar sesión en un juego sin tener que meter el usuario y contraseña manualmente. Os lo pego aquí.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import webbrowser, os, pyautogui, time
 
# Abre el wow.
RUTA_CARPETA = "C:/Users/hmh19/Desktop/Wow lich king English/Wow.exe"
webbrowser.open(os.path.realpath(RUTA_CARPETA))
 
time.sleep(7) # espera 7 ¿segundos?
x, y = pyautogui.locateCenterOnScreen('Usuario.png') # localiza la celda para introducir el nombre de usuario
pyautogui.click(x, y) # hace click
pyautogui.typewrite('MiUsuario') # introduce el nombre de usuario
x, y = pyautogui.locateCenterOnScreen('Contrasena.png')
pyautogui.click(x, y)
pyautogui.typewrite('MiContraseña')
pyautogui.press('enter') # presiona enter

Este programa funciona perfectamente, pero lo que ocurre es que aveces tarda en cargar 7 segundos, otras 6, otras 5 ... por lo que le puse 7 segundos para que funcionara siempre.

Me gustaría cambiarlo de tal manera que introduzca los datos al aparecer la imagen de 'Usuario.png' y no a los 7 segundos. He probado con un while pero no me funciona.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import webbrowser, os, pyautogui
 
RUTA_CARPETA = "C:/Users/hmh19/Desktop/Wow lich king English/Wow.exe"
webbrowser.open(os.path.realpath(RUTA_CARPETA))
 
while True:
    x, y = pyautogui.locateCenterOnScreen('Usuario.png') # aqui querría que continuara buscando hasta que apareciera en la pantalla, pero se me corta
 
pyautogui.click(x, y)
pyautogui.typewrite('MiUsuario')
x, y = pyautogui.locateCenterOnScreen('Contrasena.png')
pyautogui.click(x, y)
pyautogui.typewrite('MiContraseña')
pyautogui.press('enter')

¿Alguna idea?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Esperar hasta poder ejecutar

Publicado por kip (257 intervenciones) el 08/11/2019 15:37:59
Hola, intenta con esto:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import webbrowser, os, pyautogui
 
RUTA_CARPETA = "C:/Users/hmh19/Desktop/Wow lich king English/Wow.exe"
webbrowser.open(os.path.realpath(RUTA_CARPETA))
 
should_start = False
 
while not should_start:
    try:
        x, y = pyautogui.locateCenterOnScreen('Usuario.png') # aqui querría que continuara buscando hasta que apareciera en la pantalla, pero se me corta
        should_start = True
    except ImageNotFoundException as e:
        pass
 
pyautogui.click(x, y)
pyautogui.typewrite('MiUsuario')
x, y = pyautogui.locateCenterOnScreen('Contrasena.png')
pyautogui.click(x, y)
pyautogui.typewrite('MiContraseña')
pyautogui.press('enter')
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de Fernando
Val: 34
Ha disminuido su posición en 4 puestos en Python (en relación al último mes)
Gráfica de Python

Esperar hasta poder ejecutar

Publicado por Fernando (14 intervenciones) el 08/11/2019 22:11:58
Hola kip, gracias por responder! :D, por cierto, la serie friends es brutal. Gracias a ti he conseguido que funcione perfecto, aunque he tenido que modificar algo de código.

ImageNotFoundException me daba error:
NameError: name 'ImageNotFoundException' is not defined

Le añadí:
from pyscreeze import ImageNotFoundException

Me dió nuevo error:
TypeError: 'NoneType' object is not subscriptable

Modifique ImageNotFoundException por TypeError

Ahora funciona perfecto. Pego el definitivo.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import webbrowser, os, pyautogui
 
RUTA_CARPETA = "C:/Users/hmh19/Desktop/Wow lich king English/Wow.exe"
webbrowser.open(os.path.realpath(RUTA_CARPETA))
 
should_start = False
 
while not should_start:
    try:
        x, y = pyautogui.locateCenterOnScreen('Usuario.png')
        should_start = True
    except TypeError:
        pass
 
pyautogui.click(x, y)
pyautogui.typewrite('MiUsuario')
x, y = pyautogui.locateCenterOnScreen('Contrasena.png')
pyautogui.click(x, y)
pyautogui.typewrite('MiContraseña')
pyautogui.press('enter')
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar
Imágen de perfil de kip
Val: 1.120
Bronce
Ha mantenido su posición en Python (en relación al último mes)
Gráfica de Python

Esperar hasta poder ejecutar

Publicado por kip (257 intervenciones) el 10/11/2019 21:50:03
Que bueno que funcione Fernando.
Por cierto, tienes razon, olvide hacer el import de la custom exception del modulo.

La solucion con el TypeError es buena y para cualquiera que visite esto, aquello funciona porque la funcion retorna un None en lugar de la tupla que se asigna a 'x' y 'y' respectivamente gracias al unpacking assignment que ofrece Python.

Yo habia colocado el uso de ImageNotFoundException porque en la documentacion lo dice:

NOTE: As of version 0.9.41, if the locate functions can’t find the provided image, they’ll raise ImageNotFoundException instead of returning None.
https://pyautogui.readthedocs.io/en/latest/screenshot.html#the-locate-functions

Pero bueno, al parecer la version que tienes aun retorna None.

Friends is classic.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
2
Comentar