Skip to content

Instantly share code, notes, and snippets.

@eliasalbuquerque
Last active December 26, 2023 22:13
Show Gist options
  • Save eliasalbuquerque/33f729bf6871b6e0c1fd5ecbc63daeca to your computer and use it in GitHub Desktop.
Save eliasalbuquerque/33f729bf6871b6e0c1fd5ecbc63daeca to your computer and use it in GitHub Desktop.
Curso Dev Aprender | Jhonatan de Souza

Desafio

Criar pasta em um diretório usando somente o mouse com pyautogui:

Código:

# 202312 - Python 3.12.0


import pyautogui
import os
import logging



logging.basicConfig(level=logging.DEBUG, encoding='utf-8',
                    filename='app.log', filemode='a',
                    format='%(levelname)s - %(message)s - %(asctime)s')


def single_click(x, y):
    pyautogui.click(x, y, duration=1)


def double_click(x, y):
    pyautogui.doubleClick(x, y, duration=1)


def right_click(x, y):
    pyautogui.rightClick(x, y, duration=1)


def get_coordinates(file_path):
    coordenadas = {}
    with open(file_path, 'r') as file:
        for line in file:
            x, y, key = line.split(',')
            x, y = map(int, (x, y))
            coordenadas[key.strip()] = (x, y)
    return coordenadas


coordenadas = get_coordinates('coordenadas.txt')


def contar_pastas_no_diretorio(diretorio):
    return len(os.listdir(diretorio))


diretorio = './assets'
pastas_existentes = contar_pastas_no_diretorio(diretorio)


def criar_pasta():
    try:
        print('Abrindo diretório e criando pasta...')

        for key in coordenadas.keys():
            x, y = coordenadas[key]

            if 'single' in key:
                single_click(x, y)
            elif 'double' in key:
                double_click(x, y)
            elif 'right' in key:
                right_click(x, y)

        pastas_atualizadas = contar_pastas_no_diretorio(diretorio)

        if pastas_atualizadas > pastas_existentes:
            logging.info('Pasta criada no diretório "assets".')
            print('Pasta criada com sucesso!')
        else:
            logging.error('A nova pasta não foi criada no diretório "assets".')
            print('Não foi possível criar nova pasta.')
    except Exception as exception:
        logging.error(
            'Ocorreu um erro enquanto a nova pasta estava sendo criada')


if __name__ == '__main__':
    criar_pasta()

Nesse exemplo, foram criadas funções para click simples, duplo e click com o botão direito no mouse.

A função get_coordinates(), monta um dicionário com as coordenadas e chaves passadas no arquivo coordenadas.txt, que contém as coordenadas de clicks do mouse extraídas utilizando o módulo mouseInfo. As chaves facilitam a inserção das coordenadas por serem descritivas de acordo com a localização de cada click.

Arquivo coordenadas.txt:

1100,1049,dir_abrir_explorer_single
337,603,dir_home_single
1279,424,dir_workspace_double
570,806,dir_project_double
569,433,dir_assets_double
980,568,mouse_diretorio_right
1150,458,mouse_new_single
1335,458,mouse_folder_single
980,568,mouse_diretorio_single

Após a criação do dicionário de coordenadas, de acordo com o tipo de click, x e y recebe a coordenada do click e são passados como argumentos para as funções de click.

Após dicionário criado, a função criar_pasta() itera as chaves e para cada chave, é inserito os valores de x e y, depois, é verificado o click do mouse descrito na chave, se é single click, double click ou click com o botão direito.

O código ainda prevê tratamento de erro try/except e geração de log de execução usando logging, com execução do script sobre dunder name, statement usado para barrar a execução do script quando importado como um módulo por outro script.

Execução do script

Antes da execução do script:

PS C:\Users\elias\Workspace\python-automation> ls .\assets\
PS C:\Users\elias\Workspace\python-automation> 

Após a execução do script:

PS C:\Users\elias\Workspace\python-automation> ls .\assets\

    Directory: C:\Users\elias\Workspace\python-automation\assets

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----          12/26/2023  7:03 PM                New folder

PS C:\Users\elias\Workspace\python-automation> 

Console:

  1. Criando pasta:
PS C:\Users\elias\Workspace\python-automation> python .\pyautogui_criar_pasta.py
Abrindo diretório e criando pasta...
Pasta criada com sucesso!
PS C:\Users\elias\Workspace\python-automation> 
  1. Simulando erro:
PS C:\Users\elias\Workspace\python-automation> python .\pyautogui_criar_pasta.py
Abrindo diretório e criando pasta...
Não foi possível criar nova pasta.
PS C:\Users\elias\Workspace\python-automation> 
  1. Log:
INFO - Pasta criada no diretório "assets". - 2023-12-26 19:00:45,898
ERROR - A nova pasta não foi criada no diretório "assets". - 2023-12-26 19:03:06,262

Refatoração

Esse exercício é a refatoração do código estrutural, com a adição de:

  • funções para as repetições dos comandos pyautogui
  • criação de dicionario para facilitar o uso de coordenadas e o uso de chaves descritivas para cada click
  • função criar_pasta()
  • dunder statement para utilização como módulo sem execução direta no momento do import
  • adicionado try/except para tratamento de erros
  • adicionado logging com informação de criação de pasta e erro na execução do script
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment