반응형
[나도 코딩] 데스크탑 UI 코드 정리
01. 환경 설정
더보기
# pip install pyautogui
import pyautogui
size = pyautogui.size() # 현재 화면의 스크린 사이즈를 가지고옴
print(size) # 가로 세로 크기를 알 수 있음
# size[0] : 가로 width
# size[1] : 세로 height
02. 마우스 이동
더보기
지정한 위치로 마우스 이동
import pyautogui
# pyautogui.moveTo(100,100) # 지정한 위치로 마우스를 이동
# pyautogui.moveTo(100,200, duration= 5) # 0.25초 동안 100,200으로 이동
상대 좌표로 마우스 이동 (현재 커서가 있는 위치로부터 이동)
pyautogui.move(100,100, duration=0.25) # 현재 마우스 위치 기준으로 100,100 만큼 이동
print(pyautogui.position())
pyautogui.move(100,100, duration=0.25)
print(pyautogui.position())
마우스 위치 확인
p = pyautogui.position()
print(p[0],p[1]) # x,y
print(p.x,p.y) # x,y
03. 마우스 액션
더보기
드래그
우클릭, 휠 클릭
기본
pyautogui.sleep(3) #pyautogui가 작동할때마다 3초 대기
드래그 드랍 할때 사용
pyautogui.mouseDown()
pyautogui.mouseUp()
더블 클릭
pyautogui.doubleClick()
pyautogui.click(clicks=500)
드래그
pyautogui.moveTo(200,200)
pyautogui.mouseDown() # 마우스 버튼을 누른 상태
pyautogui.moveTo(300,300)
pyautogui.mouseUp() # 마우스 버튼을 뗀 상태
드래그
pyautogui.moveTo(1344,368)
pyautogui.drag(100,0) # 현재 위치 기준으로 100,0 만큼 드래그
pyautogui.drag(100,0,duration=0.25)
pyautogui.dragTo(1544,368,duration=0.25) # 절대 좌표 기준으로 드래그
pyautogui.scroll(-800) # 양수이면 위 방향으로 음수이면 아래 방향으로 원하는 만큼 이동
우클릭, 휠 클릭
pyautogui.sleep(3)
pyautogui.rightClick() # 우클릭
pyautogui.middleClick() # 휠 클릭
04. 마우스 정보
더보기
마우스 위치 및 색을 알려주는 프로그램
import pyautogui
pyautogui.FAILSAFE = False #마우스가 귀퉁이 밖으로 나가도 종료되지않음 , 추천 하지 않음
pyautogui.PAUSE = 1 # 모든 동작에 1초씩 sleep를 적용
마우스 위치 및 색을 알려주는 프로그램
# pyautogui.mouseInfo()
for i in range(10):
pyautogui.move(100,100)
pyautogui.sleep(1)
05. 스크린
더보기
스크린 샷 찍기
마우스 Info 보기
img = pyautogui.screenshot()
img.save("screenshot.png")
마우스 Info 보기
pyautogui.mouseInfo()
#22,21 23,134,208 #1786D0
pixel = pyautogui.pixel(22,21)
print(pixel)
print(pyautogui.PixelMatchesColors(22,21,(23,134,208)))
06 - 1. 이미지 처리 - 대기
더보기
import pyautogui
file_menu = pyautogui.locateOnScreen("Desktop//file_menu.png")
print(file_menu)
pyautogui.click(file_menu)
trash_icon = pyautogui.locateOnScreen("Desktop//trash_icon.png")
pyautogui.moveTo(trash_icon)
화면 해상도, 이미지가 변경되면 오류가 날 가능성이 매우 높음
화면에 중복되는 이미지가 여러개 있을 경우 처리법
for i in pyautogui.locateAllOnScreen("Desktop//file_menu.png"):
print(i)
pyautogui.click(i, duration=0.25)
처음 나오는 이미지만 클릭하고 넘어가는 법
check_box = pyautogui.locateOnScreen("Desktop//file_menu.png")
pyautogui.click(check_box)
06 - 2. 이미지 처리 - 속도 개선
더보기
1. GrayScale - 흑백으로 만든 후 탐색 - 정확도는 떨어질 수 있음
trash_icon = pyautogui.locateOnScreen("Desktop//trash_icon.png", grayscale=True)
pyautogui.moveTo(trash_icon)
2. 범위 지정
trash_icon = pyautogui.locateOnScreen("Desktop//trash_icon.png", region=x,y,width,height)
# 탐색 시작 위치 x,y
pyautogui.moveTo(trash_icon)
3. 정확도 조정 - pip install opencv-python 설치 필요
run_btn = pyautogui.locateOnScreen("Desktop//run_btn.png", confidence=0.9) #90퍼센트이상 일치하면 작동
pyautogui.moveTo(run_btn)
<자동화 대상이 바로 보여지지 않는 경우>
1. 계속 기다리기
notepad = pyautogui.locateOnScreen("Desktop//file_menu_notepad.png")
if notepad:
pyautogui.click(notepad)
else:
print("발견 실패")
while notepad is None:
notepad = pyautogui.locateOnScreen("Desktop//file_menu_notepad.png")
print("발견 실패")
pyautogui.click(notepad)
2. 일정 시간동안 기다리기
import time
import sys
timeout = 10 # 10초 대기
start = time.time() # 시작 시간 설정
notepad = None
while notepad is None:
notepad = pyautogui.locateOnScreen("Desktop//file_menu_notepad.png")
end = time.time() # 종료 시간 설정
if end - start > timeout: # 지정한 10초를 초과하면
print("시간 종료")
sys.exit()
pyautogui.click(notepad)
2-1. 일정 시간동안 기다리기 - 함수로 정의
def find_target(img_file, timeout = 30):
start = time.time()
target=None
while target is None:
target = pyautogui.locateOnScreen(img_file)
end = time.time()
if end - start > timeout:
break
return target
def my_click(img_file, timeout =30):
target = find_target(img_file,timeout)
if target:
pyautogui.click(target)
else:
print(f"[Timeout {timeout}s] Target not found({img_file}). Terminate program.")
sys.exit()
my_click("Desktop//file_menu_notepad.png", 10)
07. 윈도우 다루기
더보기
활성화 되지 않았을경우 활성화 시키기 ( 최소,최대)
현재 활성화된 창과 정보 보기
import pyautogui
fw = pyautogui.getActiveWindows() # 현재 활성화된 창 (vs코드)
print(fw.title) # 창의 제목 정보
print(fw.size) # 창의 크기 정보 (width, height)
print(fw.left, fw.top, fw.right, fw.bottom) # 창의 좌표 정보
pyautogui.click(fw.left + 25 , fw.top + 20)
for w in pyautogui.getAllWindows(): #모든 윈도우 가져오기
print(w)
활성화 되지 않았을경우 활성화 시키기 ( 최소,최대)
w = pyautogui.getWindowsWithTitle("제목 없음")[0]
print(w)
if w.isActive == False: #현재 활성화되지 않았다면
w.activate() # 활성화 (맨 앞으로 가지고 오기)
if w.isMaximized == False: #현재 최대화가 되지 않았다면
w.maximize()
pyautogui.sleep(1)
if w.isMinimized == False: #현재 최소화가 되지 않았다면
w.minimize()
pyautogui.sleep(1)
w.restore() # 원상태복구
w.close() #윈도우 닫기
08. 키보드
더보기
기본 입력
특수 문자( $[shift 4] 입력하기)
조합키 (Hot key)
간편한 조합기
한글 입력 - pip install pyperclip 설치 필요
import pyautogui
w = pyautogui.getWindowsWithTitle("제목 없음")[0] # 메모장 1개를 띄운 상태에서 가져옴
w.activate()
pyautogui.write("12345")
pyautogui.write("Coding", interval=0.25)
pyautogui.write("코딩 연습") # 한글 처리는 안됨
# t e s t를 입력후 왼쪽으로 두번 오른쪽으로 한번 이동후 l a 입력후 엔터
pyautogui.write(["t","e","s","t","left","left","right","l","a","enter"],interval=1.25)
특수 문자( $[shift 4] 입력하기)
pyautogui.keyDown("shift") # 쉬프트를 누른 상태에서
pyautogui.press("4") # 4번을 누르고
pyautogui.keyUp("shift") # 쉬프트를 뗀다
조합키 (Hot key)
pyautogui.keyDown("ctrl")
pyautogui.keyDown("a")
pyautogui.keyUp("a")
pyautogui.keyUp("ctrl")
간편한 조합기
pyautogui.hotkey("ctrl","alt","shift","a")
pyautogui.hotkey("ctrl","a")
한글 입력 - pip install pyperclip 설치 필요
import pyperclip
pyperclip.copy("코딩 연습") #"코딩 연습"글자를 클립보드에 저장
pyautogui.hotkey("ctrl","v") # 클립보드에 있는 내용을 붙어넣기
09. 메시지 박스
더보기
카운트 다운
알람 및 경고 창
print("곧 시작합니다...")
pyautogui.countdown(3)
print("자동화 시작")
알람 및 경고 창
pyautogui.alert("자동화 수행에 실패하였습니다.","경고") # 확인 버튼만 있는 팝업
result = pyautogui.confirm("계속 진행하시겠습니까?","확인") # 확인,취소 버튼
result = pyautogui.prompt("파일명을 무엇으로 하시겠습니까?", "입력")
result = pyautogui.password("암호를 입력하세요.") # 암호 입력
10. 로그
더보기
파일
import logging
DEBUG를 바꿔서 메시지 범위를 수정 가능
logging.basicConfig(level = logging.DEBUG, format="%(asctime)s [%(levelname)s] %(message)s")
debug < info < error < critical 순서로 커짐
logging.debug("아 이거 누가 짠거야")
logging.info("자동화 수행 준비")
logging.warning("이 스크립트는 조금 오래 되었습니다. 실행상에 문제가 있을 수 있습니다.")
logging.error("에러가 발생하였습니다. 에러 코드는 ...")
logging.critical("복구가 불가능한 심각한 문제가 발생했습니다...")
터미널과 파일에 함꼐 로그 남기기
import logging
from datetime import datetime
# 시간 [로그레벨] 메시지 형태로 로그를 작성
logFormatter = logging.Formatter("%(asctime)s [%(levelname)s] %(message)s")
logger = logging.getLogger()
#로그 레벨 생성
logger.setLevel(logging.DEBUG)
스트림
streamHandler = logging.StreamHandler()
streamHandler.setFormatter(logFormatter)
logger.addHandler(streamHandler)
파일
filename = datetime.now().strftime("mylogfile_%Y%m%d%H%M%S.log")
fileHandler = logging.FileHandler(filename, encoding="utf-8")
fileHandler.setFormatter(logFormatter)
logger.addHandler(fileHandler)
logger.debug("로그를 남겨보는 테스트를 진행합니다.")
11. 파일 시스템
더보기
파일 기본
만약 폴더 내에서 특정 패턴을 가진 파일들을 찾을려면
import os
print(os.getcwd()) # 현재 작업 공간
os.chdir("..") # 부모 폴더로 이동
print(os.getcwd())
os.chdir("c:/") #주어진 절대 경로로 이동
print(os.getcwd())
파일 경로
file_path = os.path.join(os.getcwd(),"my_file.txt") # 절대 경로 생성
print(file_path)
파일 경로에서 폴더 정보 가져오기
print(os.path.dirname(r"C:\Users\jongseoung\Documents\Python\RPA\Desktop/my_file.txt"))
파일 정보 가지고 오기
import time
import datetime
# 파일의 생성 날짜
ctime = os.path.getctime("run_btn.png")
print(ctime)
# 날짜 정보를 strftime을 통해서 연월일 시분초 형태로 출력
print(datetime.datetime.fromtimestamp(ctime).strftime("%Y%m%d %H:%M:%S"))
# 파일의 수정 날짜
mtime = os.path.getmtime("run_btn.png")
print(datetime.datetime.fromtimestamp(mtime).strftime("%Y%m%d %H:%M:%S"))
# 파일의 마지막 접근 날짜
atime = os.path.getatime("run_btn.png")
print(datetime.datetime.fromtimestamp(atime).strftime("%Y%m%d %H:%M:%S"))
# 파일 크기
size = os.path.getsize("run_btn.png") # 파일의 크기를 바이트 단위로 가지고옴
print(size)
파일 목록 가지고 오기
from ast import pattern
import os
from unittest import result
print(os.listdir()) # 모든 폴더, 파일 목록 가져오기
print(os.listdir("Desktop")) # 주어진 폴더 밑에 모든 폴더, 파일 목록 가지고오기
파일 목록 가져오기 (하위 폴더 포함)
result = os.walk("Desktop") # 주어진 폴더 밑에 모든 폴더, 파일 목록 가지고오기
result = os.walk(".") # 현재 폴더 밑에 모든 폴더, 파일 목록 가지고오기
for root, dirs, files in result:
print(root,dirs,files)
만약 폴더 내에서 특정 파일들을 찾을려면?
name = "11_file_system.py"
result = []
for root, dirs, files in os.walk("."):
if name in files:
result.append(os.path.join(root,name))
print(result)
만약 폴더 내에서 특정 패턴을 가진 파일들을 찾을려면
# 예시) *.xlsx, *.txt, 자동화*.png
import fnmatch
pattern = "*.png" # .png로 끝나는 모든 파일
result = []
for root, dirs, files in os.walk("."):
for name in files:
if fnmatch.fnmatch(name, pattern): # 이름과 패턴이 일치하면
result.append(os.path.join(root,name))
print(result)
주어진 경로가 파일인지? 폴더인지?
import os
print(os.path.isdir("Exel")) #Exel은 폴더인가?
print(os.path.isfile("Exel")) #Exl은 파일인가?
만약 지정된 경로에 해당하는 파일 / 폴더가 없다면?
print(os.path.isdir("run_btn.png")) # run_btn.png은 폴더인가? 파일이 없으니 False
print(os.path.isfile("run_btn.png")) # run_btn.png은 파일인가? 파일이 없으니 False
# 주어진 경로가 존재하는지?
if os.path.exists("run_btn.png"):
print("파일 또는 폴더가 존재합니다.")
else:
print("존재 하지 않습니다")
파일 기본 2
파일 만들기
open("new_file.txt","a").close() # 빈 파일 생성
파일명 변경하기
os.rename("new_file.txt","new_file_rename.txt") # new_file.txt -> new_file_rename.txt로 이름 변경
파일 삭제
os.remove("new_file_rename.txt")
폴더 만들기
os.mkdir("new_folder")
os.mkdir("new_folders/a/b/c") # 실패 : 하위 폴더를 가지는 폴더 시도
os.makedirs("new_folders/a/b/c") # 성공 : 하위 폴더를 가지는 폴더 생성
폴더명 변경하기
os.rename("new_folder","new_folder_rename")
폴더 지우기
os.rmdir("new_folder_rename") # 폴더 안이 비었을 경우에만 가능
import shutil
shutil.rmtree("new_folders") # 폴더 안이 비어 있지 않아도 완전 삭제 가능
모든파일이 삭제될 수 있으므로 주의!!!
파일 복사하기
어떤 파일을 폴더 안으로 복사하기
- copy, copyfile : 메타정보 복사 x
- copy2 : 메타정보 복사 o
shutil.copy("Desktop//run_btn.png","test_folder") # 원본 경로, 대상 경로
shutil.copy("Desktop//run_btn.png","test_folder/copide_run_btn.png") # 다른 이름으로 복사
shutil.copyfile("Desktop//run_btn.png","test_folder/copide_run_btn2.png") # 원본 경로, 대상 파일 경로
shutil.copy2("Desktop//run_btn.png","test_folder/copide_run_btn3.png") # 원본 경로, 대상 폴더
폴더 기본
# 폴더 복사
shutil.copytree("test_folder","test_folder2") # 원본 폴더, 다른 이름으로 복사
# 폴더 이동
shutil.move("test_folder","test_folder2")
shutil.move("test_folder2","test_folder") # 폴더명이 변경되는 효과
깃 허브 : https://github.com/jong-seoung/Python/tree/main/RPA/Desktop
[출처] 나도 코딩 강의 : https://www.youtube.com/watch?v=exgO1LFl9x8
반응형
'Python > 나도코딩 정리' 카테고리의 다른 글
[나도 코딩] 엑셀 자동화 코드 정리 (1) | 2022.10.18 |
---|