Execute all functions in a file without explicitly calling them

def some_magic():
    import a
    for i in dir(a):
        item = getattr(a,i)
        if callable(item):
            item()

if __name__ == '__main__':
    some_magic()
#!/usr/local/bin/python3
import inspect
import sys


def f1():
    print("f1")


def f2():
    print("f2")


def some_magic(mod):
    all_functions = inspect.getmembers(mod, inspect.isfunction)
    for key, value in all_functions:
        if str(inspect.signature(value)) == "()":
            value()

if __name__ == '__main__':
    some_magic(sys.modules[__name__])
members = inspect.getmembers(self)

for key, value in members:

    if key.startswith("run_"):
        if callable(value):
            if value():
                break

References
https://stackoverflow.com/questions/28643534/is-there-a-way-in-python-to-execute-all-functions-in-a-file-without-explicitly-c

Convert Image to RGB and Grayscale using PIL

im = Image.open("audacious.png")
rgb_im = im.convert('RGB')
rgb_im.save('audacious.jpg')
from PIL import Image
img = Image.open('image.png').convert('LA')
img.save('greyscale.png')

LA mode has luminosity (brightness) and alpha. If you use LA mode, then greyscale.png will be an RGBA image with the alpha channel of image.png preserved. If you use L mode, then greyscale.png will be an RGB image (with no alpha).

References
https://stackoverflow.com/questions/48248405/cannot-write-mode-rgba-as-jpeg
https://stackoverflow.com/questions/12201577/how-can-i-convert-an-rgb-image-into-grayscale-in-python

Iterate over Excel columns using openpyxl

from openpyxl import Workbook, worksheet, load_workbook

wb: Workbook = load_workbook(filename="data.xlsx")
ws: worksheet = wb.active

end_column = ws.max_column
start_column = 1
column_index = start_column

while column_index <= end_column:
    # here we just want first row
    print(ws.cell(1, column_index).value)
    column_index += 1

 

Iterate over Excel rows using openpyxl

from openpyxl import Workbook, worksheet, load_workbook

wb: Workbook = load_workbook(filename="data.xlsx")
ws: worksheet = wb.active

end_row = ws.max_row
# start after header
start_row = 2
row_index = start_row

while row_index <= end_row:
    print(ws["A" + str(row_index)].value)
    print(ws["B" + str(row_index)].value)
    print(ws["C" + str(row_index)].value)
    print(ws["D" + str(row_index)].value)
    print(ws["E" + str(row_index)].value)
    row_index += 1

 

Open Image in Python PIL

# Imports PIL module 
from PIL import Image 

# open method used to open different extension image file 
im = Image.open(r"C:\Users\System-Pc\Desktop\ybear.jpg") 

# This method will show image in any image viewer 
im.show() 
# Imports PIL module 
from PIL import Image 

# open method used to open different extension image file 
im = Image.open(r"C:\Users\System-Pc\Desktop\lion.png") 

# This method will show image in any image viewer 
im.show() 

References
https://www.geeksforgeeks.org/python-pil-image-open-method/

Locate something on the screen using PyScreeze on Python

  • locateOnScreen(image, grayscale=False) – Returns (left, top, width, height) coordinate of first found instance of the image on the screen. Returns None if not found on the screen.
  • locateCenterOnScreen(image, grayscale=False) – Returns (x, y) coordinates of the center of the first found instance of the image on the screen. Returns None if not found on the screen.
  • locateAllOnScreen(image, grayscale=False) – Returns a generator that yields (left, top, width, height) tuples for where the image is found on the screen.
  • locate(needleImage, haystackImage, grayscale=False) – Returns (left, top, width, height) coordinate of first found instance of needleImage in haystackImage. Returns None if not found on the screen.
  • locateAll(needleImage, haystackImage, grayscale=False) – Returns a generator that yields (left, top, width, height) tuples for where needleImage is found in haystackImage.

 

import pyscreeze
button7location = pyscreeze.locateOnScreen('calc7key.png')
button7location
(1416, 562, 50, 41)
button7x, button7y = pyscreeze.center(button7location)
button7x, button7y
(1441, 582)
pyscreeze.click(button7x, button7y)  # clicks the center of where the 7 button was found
import pyscreeze
x, y = pyscreeze.locateCenterOnScreen('calc7key.png')
pyscreeze.click(x, y)
import pyscreeze
for pos in pyscreeze.locateAllOnScreen('someButton.png')
...   print(pos)
...
(1101, 252, 50, 50)
(59, 481, 50, 50)
(1395, 640, 50, 50)
(1838, 676, 50, 50)
list(pyscreeze.locateAllOnScreen('someButton.png'))
[(1101, 252, 50, 50), (59, 481, 50, 50), (1395, 640, 50, 50), (1838, 676, 50, 50)]
import pyscreeze
button7location = pyscreeze.locateOnScreen('calc7key.png', grayscale=True)
button7location
(1416, 562, 50, 41)

References
https://pypi.org/project/PyScreeze/

Template Matching using OpenCV Python

image_gray: np.ndarray
TM_METHOD=cv2.TM_CCOEFF_NORMED

def __init__(self):
    self.take_screenshot()

def take_screenshot(self):
    user32 = ctypes.windll.user32
    user32.SetProcessDPIAware()
    image = ImageGrab.grab()
    # save on file
    # image.save('screenshot.jpg', format='JPEG', quality=20)

    # load image from memory
    image_rgb = np.array(image)

    # load from file
    # image_rgb=cv2.imread('screenshot.jpg')
    self.image_gray = cv2.cvtColor(image_rgb, cv2.COLOR_BGR2GRAY)

@staticmethod
def save_screenshot():
    user32 = ctypes.windll.user32
    user32.SetProcessDPIAware()
    image = ImageGrab.grab()
    image.save("screenshot.jpg")

def template_available(self, template_path: str, threshold=0.9):

    # self.take_screenshot()

    template = cv2.imread(template_path, 0)
    # w, h = template.shape[::-1]

    res = cv2.matchTemplate(self.image_gray, template, self.TM_METHOD)
    loc = np.where(res >= threshold)

    if len(loc[0]) == 0 & len(loc[1]) == 0:
        return False
    else:
        print("template_available : " + template_path)
        return True

def template_count(self, template_path: str, threshold=0.9):

    # self.take_screenshot()

    template = cv2.imread(template_path, 0)
    # w, h = template.shape[::-1]

    res = cv2.matchTemplate(self.image_gray, template, self.TM_METHOD)
    loc = np.where(res >= threshold)

    return len(loc[0])

def template_location(self, template_path: str, threshold=0.9):

    self.take_screenshot()

    template = cv2.imread(template_path, 0)
    w, h = template.shape[::-1]

    res = cv2.matchTemplate(self.image_gray, template, self.TM_METHOD)
    loc = np.where(res >= threshold)

    if len(loc[0]) == 0 & len(loc[1]) == 0:
        return None
    else:
        click_y = loc[0][0] + h / 2
        click_x = loc[1][0] + w / 2

        return click_x, click_y

def move_mouse_to_template(self, template_path: str):
    loc = self.template_location(template_path)

    if loc is not None:
        click_x = loc[0]
        click_y = loc[1]
        pyautogui.moveTo(click_x, click_y)

def click_template(self, template_path: str, threshold=0.9):
    loc = self.template_location(template_path, threshold)

    if loc is not None:
        click_x = loc[0]
        click_y = loc[1]
        pyautogui.click(click_x, click_y)
        pyautogui.FAILSAFE = False
        pyautogui.moveTo(0, 0)
        print("click_template : " + template_path)
        return True

    return False

@staticmethod
def scroll_mouse(value=10):
    pyautogui.scroll(value)
    pyautogui.FAILSAFE = False
    pyautogui.moveTo(0, 0)

@staticmethod
def get_template_path(template: str):
    template_name = f"template{template}.jpg"
    template_path = os.path.join(os.getcwd(), 'templates', template_name)
    return template_path