본문 바로가기

Python93

문서를 불러와서 저장하거나 다른이름으로 저장하는 방법 업무자동화를 하면서 빈 문서에서부터 편집을 하시는 분은 많지 않을 거라고 생각해요. 보통은 특정 포맷의 템플릿 파일을 만들어 두고, 단순 반복 작업에 자동화를 활용하죠. 대표적으로 문서의 특정 폼을 필드와 누름틀로 만들어 두고, 엑셀 또는 다른 한/글 문서들의 데이터를 가져와서 빈 칸을 채우는 식의 작업이 대부분일 것 같아요. (필드와 누름틀에 대한 사용법도 조만간 해드릴 거예요.) 이번 포스팅에서는 문서를 불러와서, 편집 후 저장하거나, 다른 이름으로 저장하는 방법을 알아볼게요. 우선 문서를 불러오는 명령어는 open, 문서를 저장하는 명령어는 save, 다른이름으로 저장하는 메서드는 save_as 예요. hwpx.open 메서드의 arg 파라미터 가끔 대량의 문서를 불러와서 일괄편집하고 저장하는 작업.. 2023. 11. 30.
두 개 이상의 문서를 동시에 열어서 편집하고 싶은 경우 한/글은 "창"과 "탭"을 통해 동시에 두 개 이상의 문서를 열어서 편집할 수 있습니다. pyhwpx에서 탭을 추가하는 메서드는 add_tab()이며, 창을 추가하는 메서드는 add_doc()입니다. 편집문서를 전환하려면 switch_to(idx) 메서드를 사용합니다. 다만 유의하실 점이 하나 있는데요. 마우스 클릭이나 Alt-Tab 등으로 직접 한/글 창의 포커스를 변경하면 hwpx인스턴스도 (switch_to 메서드와 상관없이) 동일하게 포커스된 문서를 가리키게 됩니다. 특히 빈 문서가 아니라 기존의 문서를 열어서 편집하시는 작업이라면, 작업 도중 인덱스 몇 번이 어느 문서를 가리키고 있는지 헷갈릴 수 있는데요. 인스턴스 자체를 여러 개 생성하여 작업하실 수도 있습니다! 개인적으로 이 방법이 조작이 .. 2023. 11. 30.
스크립트매크로를 파이썬 함수로 고쳐주는 함수 #clipboard_to_pyfunc() 자동화 작업을 하다 보면, 한/글 API에 나와 있지 않은 기능을 스크립트매크로로 녹화해서 파이썬 함수로 변환하려고 하는데, 매크로 자체가 너무 길고 복잡할 때가 있어요. 예를 들어, 아래는 "찾아바꾸기"를 녹화한 스크립트매크로예요. function OnScriptMacro_중국어1성() { HAction.GetDefault("AllReplace", HParameterSet.HFindReplace.HSet); with (HParameterSet.HFindReplace) { MatchCase = 0; AllWordForms = 0; SeveralWords = 0; UseWildCards = 0; WholeWordOnly = 0; AutoSpell = 1; Direction = FindDir("Forward.. 2023. 11. 30.
기본메서드 매핑 완료 2023. 11. 16. 01:48 올해 수능시험을 보는 수많은 젊은이들, 이따 있을 시험을 위해 어마어마한 시간을 준비했을텐데.. 밤잠을 못 이루고 있을 것 같다. 난 졸려 죽겠다ㅜ 방금 드디어 공식문서의 액션리스트 중 현재 실행되는 모든 액션을 snake_case로 매핑 완료했다. 이젠 메서드에만 있고, API문서에는 없는 메서드들이 남았다. (매핑은 완료했고, 문서화가 남았다.) docstring 작성도 평생 이렇게 꼼꼼하게 해 본 적이 없었다. 몸은 힘들지만, 그래. 솔직히 즐겁기도 하다. 장고로 직접 블로그를 만들어 운영했던 2017년이 문득 기억난다. 웹에 대해 아무 것도 모르고 (지금도 잘 모르지만) 무작정 장고가 좋아서 이것저것 따라해보다가 썸머노트와 프리즘js, 여러 가지 라이브러리를 추.. 2023. 11. 16.
hwpx 모듈 개발 중에 버그 하나를 해결하면서.. 2023. 11. 15. 개발일기 hwpx 모듈 개발에 착수한지 일주일쯤 되었는데, 예상하지 못한 몇 가지 문제를 우연히 발견하게 되었다. Hwp라는 클래스를 만들면서, 생성자(__init__) 안에서 win32로 한/글 오토메이션 오브젝트를 생성하고 인스턴스가 실행하는 모든 메서드는 내부의 hwp 오브젝트와 연결되게끔 매핑을 해두었는데, 오토메이션 프로퍼티 중 HeadCtrl과 LastCtrl 두 개가 말썽이었다. Hwp인스턴스.HeadCtrl이 클래스 내부에 생성되어 있는 hwp오브젝트.HeadCtrl과 같지 않다는 것을 발견했다. 새 문서를 Hwp로 열었는데, 표를 몇 개 추가한 후 여전히 인스턴스.LastCtrl이 "단 정의"라는 충격적인 결과를 보는 와중에도, hwp.LastCtrl.Next.U.. 2023. 11. 15.
zsh에서 프로젝트 가상환경 자동활성화 feat. zsh-autoenv 터미널을 최근 bash에서 다시 zsh로 변경해보았습니다. 리눅스 터미널을 강력하게 사용하는 편은 아닌데, 강의 때 wsl을 활용하면서 너무 프롬프트 경로가 길어서 제가 입력하는 명령어가 자꾸 줄이 바뀌는 게 학생들 보기에 불편할 것 같았습니다. 마침 예전에 사용하던 oh-my-zsh 중에 powerlevel10k가 예뻤던 게 기억나서 오늘 테마 세팅까지 후다닥 마쳤습니다. 다만, 몇 가지 걸리는 게 있었는데 bash에서는 --rcfile 옵션을 줘서 간단히 가상환경을 설정할 수 있었는데 zsh에서는 이상하게 --rcs가 잘 먹지 않아서 스택오버플로, 스택익스체인지 등의 답변을 참고하면서 가상환경 자동 활성화를 시도해보다 결국 askdjango 이진석 님께서 추천해주신 autoenv를 사용하게 됐습니다... 2023. 10. 18.
파이썬의 리스트도 표현할 수 있나? # 투두리스트 앱 만들기 앞선 포스팅에서는 간단히 rx.heading이나 rx.text를 이용해 화면에 글자를 출력해보았으며 State라는 클래스와 클래스 변수인 Var를 이용해 동적인 웹앱, Counter를 구현해보았다. 그럼 이런 생각도 해볼 수 있을텐데? 단순한 텍스트 목록은 rx.text를 나열하면 될텐데, ["a", "b", "c"] 같은 리스트도 표현할 수 있을까? (직접 공식문서를 찾아 읽어보신 분이라면, 어렵지 않게 구현하실 것) 이 때는 우리가 사용할 또 다른 레이아웃 컴포넌트, 바로 rx.foreach가 필요하게 되는 시점이다. (굳이 비유하면 파이썬의 for문과 map 함수를 합친 느낌이다.) 참고로 rx.foreach는 단순한 파이썬의 for문과는 살짝 다르다. 무엇이 다른고 하니, rx.foreach(리스.. 2023. 10. 3.
간단한 동적 웹앱 만들어보기 : Counter 이번 포스팅에서는 아래와 같은 페이지를 만들어 보고, State의 사용법에 대해 간단히 이해해보고자 한다. 아래와 같은 코드로 index 함수를 만들었다. import reflex as rx def index(): return rx.vstack( # 행 방향으로 나열하는 레이아웃 컴포넌트 rx.heading("Counter"), # 제목 rx.hstack( # 열 방향으로 나열하는 레이아웃 컴포넌트 rx.button("-", color_scheme="red"), rx.heading("0"), rx.button("+", color_scheme="green") ) ) app = rx.App() app.add_page(index) app.compile() 참고로 위에서 사용한 vstack, hstack은 각각.. 2023. 10. 3.
reflex 웹페이지는 기본적으로 클래스 하나, 함수 하나로 구성된다. reflex는 프론트엔드와 백엔드의 구분이 다소 모호(?)한 pure-python fullstack webframework이다. reflex로 만드는 웹앱은 기본적으로 State라는 클래스 하나, 그리고 index라는 함수 하나로 구성된다. 이를 이해하기 위해서는 가장 간단한 앱 하나를 만들어보는 것이 좋다. 우선 State 없이 간단한 페이지함수인 index를 만들어보자. import reflex as rx def index(): return rx.heading("Hello world!") app = rx.App(state=State) app.add_page(index) app.compile() python 코드로 구성된 간단한 소스이지만, 이는 리플렉스를 구성하고 있는 node.js, React, N.. 2023. 10. 3.