해결된 질문
작성
·
65
답변 2
2
ㅇㅅㅇ님 안녕하세요?
아래아한글 업데이트로 인해
제가 예제를 만들고 실행했던 당시에는 잘 실행되던 코드들이
오류가 발생하는 경우가 있습니다.
특히 2024버전 최신 업데이트부터는 상당히 많은 듯 해요...ㅜ
그래도 최소한 아래 보여드리는 코드는 잘 작동할 것입니다.. 죄송합니다.
hwp.FindCtrl()은 커서에서 가장 가까운 컨트롤을 선택하는 명령어입니다.
아래 영상처럼, 일반적으로 표 앞이든 뒤든 커서가 표(또는 표의 조판부호)에 붙어있기만 하면 가까이에 있는 표가 선택이 되어야 하지만
영상이 너무 작게 보여 불편하시면,
①영상에 우클릭하시고,
②"새 탭에서 이미지 열기"를 선택하시면 전체화면에 가까운 크기로 보실 수 있습니다.
hwp.FindCtrl()
메서드의 가장 큰 두 가지 문제는
① 탐색방향을 특정할 수 없기 때문에, 주변에 다른 컨트롤이 있는 경우
원하지 않는 컨트롤을 선택하는 경우가 발생할 수 있습니다.
(혹은 아무 컨트롤도 선택하지 않든지요...)
② 그리고 표의 글자처럼 취급
속성이 꺼져 있는 경우에는
조판부호의 위치가 표와 떨어져 있는 경우가 있기 때문에
겉으로 볼 때에는 표 옆에 커서를 두고 hwp.FindCtrl()
을 실행하지만
표가 선택되지 않는 경우가 있기도 합니다.
가급적 hwp.FindCtrl()
대신 명시적으로 문서의 끝방향, 또는 시작방향으로
가장 먼저 만나는 컨트롤을 선택하는 Run메서드인
SelectCtrlFront
/ SelectCtrlReverse
를 사용해주시기 바랍니다.
커서의 전방/후방으로 컨트롤을 탐색하는 명령어는 각각 아래와 같습니다.
hwp.HAction.Run("SelectCtrlFront") # 문서의 끝방향으로 탐색
hwp.HAction.Run("SelectCtrlReverse") # 문서의 시작방향으로 탐색
저도 최근에는 FindCtrl 대신 대부분의 경우 위의 SelectCtrl~ 코드를 활용하고 있습니다.
가장 확실한 방법은 hwp.HeadCtrl이나 hwp.LastCtrl에서부터 순차탐색하는 것입니다.
아래의 코드는 문서의 target번째 표를 선택합니다.
target = 0 # 0번(첫 번째) 표 선택
ctrl = hwp.HeadCtrl
n = 0
while ctrl:
if ctrl.UserDesc == "표":
if n == target:
hwp.SetPosBySet(ctrl.GetAnchorPos(0))
if not hwp.HAction.Run("SelectCtrlFront"):
hwp.HAction.Run("SelectCtrlReverse")
break
else:
n += 1
ctrl = ctrl.Next
컨트롤을 선택하는 다소 간단한 기능인데도 위의 코드는 상당히 깁니다..
pyhwpx
모듈을 설치하시면 아래와 같은 단축코드를 사용하실 수 있습니다.
from pyhwpx import Hwp
hwp = Hwp()
# target번째 표의 첫 번째(A1) 셀로 이동
target = 2
hwp.get_into_nth_table(target)
# A1셀 안에서 아래 코드를 실행하면 표 전체를 선택함
hwp.SelectCtrlFront()
for ctrl in hwp.ctrl_list:
if ctrl.UserDesc == "표":
hwp.select_ctrl(ctrl)
hwp.set_font(FaceName="휴먼명조", Height=30, Italic=True)
pyhwpx로 생성한 hwp 객체는
win32com으로 생성한 hwp의 명령어를 전부 포함하고 있으므로,
pip로 설치하시고, 코드 상단의 임포트문만 바꾸시면 됩니다.
도움이 되었길 바랍니다.
행복한 하루 되세요^^
0
안녕하세요, 인프런 AI 인턴입니다. ㅇㅅㅇ님.
아래아한글을 자동화할 때 hwp.FindCtrl()
메서드를 사용하여 표를 선택하는 과정에서 문제가 발생하는 것 같네요. 커서 위치가 맞아야만 표를 제대로 선택할 수 있는 상황이라 불편함을 겪고 계시는 것을 확인했습니다. 이에 대한 해결책을 제시해드릴 링크와 답변을 제공해 드립니다.
우선, 비슷한 문제에 대한 답변이 제공된 두 가지 예시를 참고해 보시면 도움이 될 것입니다:
위 링크들의 답변에서 hwp.SetPosBySet()
메서드를 사용하는 방법과 헤드나 열고 루프를 통해 표를 찾아서 이동하는 방법
을 확인할 수 있습니다.
헤드 컨트롤을 사용하여 표의 위치를 찾기
hwp.SetPosBySet()
메서드를 이용하여 커서를 이동시키기다음은 hwp.SetPosBySet()
와 함께 표를 정확히 선택하는 코드 예시입니다:
# 표의 첫 번째 위치로 커서를 이동합니다.
hwp.SetPosBySet({"row": 0, "col": 0})
# 표를 찾습니다.
hwp.FindCtrl()
# 표 내부 셀을 선택합니다.
hwp.Run('ShapeObjTableSelCell')
SetPosBySet
를 통해 커서의 위치를 정확히 지정한 후 FindCtrl
를 호출하여 표를 찾습니다.MovePos(2)
를 사용하여 문서의 시작 위치로 커서를 이동해 보세요.# 문서 시작 위치로 커서 이동
hwp.MovePos(2)
이 방법들을 시도하시면 커서 위치에 상관없이 정확한 표 선택을 할 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
항상 버전이 문제지요 ^^
빠르고, 수준 높은 답변 감사드립니다.~~