인프런 커뮤니티 질문&답변

ㅇㅅㅇ님의 프로필 이미지
ㅇㅅㅇ

작성한 질문수

직장인에게 꼭 필요한 파이썬-아래아한글 자동화 레시피

날짜 뒤에 요일 붙이기

hwp.FindCtrl() 에서 표를 한번에 선택하지 못 하는 문제

해결된 질문

작성

·

92

1

① hwp.FindCtrl() 로 표를 선택하려고 할때

단번에 선택되지 않고 표 바로 뒤에 커서를 둬야 선택되는 것 같습니다.


② "날짜 뒤에 요일 붙이기" 파트를 진행하면서 제공해주신 파일과 코드를 그대로 했음에도 표가 선택되지 않아 한글 파일이 열려 있을 때 표 바로 뒤에 커서를 위치시키고 hwp.FindCtrl() 실행하니 표를 선택합니다.

 

파일을 열었을 때 커서 위치에 상관없이 첫번째 표를 를 정확하게 선택하는 방법이 궁금합니다.

 

답변 2

2

일코님의 프로필 이미지
일코
지식공유자

ㅇㅅㅇ님 안녕하세요?

아래아한글 업데이트로 인해

제가 예제를 만들고 실행했던 당시에는 잘 실행되던 코드들이

오류가 발생하는 경우가 있습니다.

특히 2024버전 최신 업데이트부터는 상당히 많은 듯 해요...ㅜ

그래도 최소한 아래 보여드리는 코드는 잘 작동할 것입니다.. 죄송합니다.

 

1. hwp.FindCtrl()에서 문제가 발생하는 경우

hwp.FindCtrl()은 커서에서 가장 가까운 컨트롤을 선택하는 명령어입니다.

아래 영상처럼, 일반적으로 표 앞이든 뒤든 커서가 표(또는 표의 조판부호)에 붙어있기만 하면 가까이에 있는 표가 선택이 되어야 하지만

녹화_2024_09_29_16_39_51_515.gif

영상이 너무 작게 보여 불편하시면,

①영상에 우클릭하시고,

②"새 탭에서 이미지 열기"를 선택하시면 전체화면에 가까운 크기로 보실 수 있습니다.

 

hwp.FindCtrl() 메서드의 가장 큰 두 가지 문제는

① 탐색방향을 특정할 수 없기 때문에, 주변에 다른 컨트롤이 있는 경우

원하지 않는 컨트롤을 선택하는 경우가 발생할 수 있습니다.

(혹은 아무 컨트롤도 선택하지 않든지요...)

② 그리고 표의 글자처럼 취급 속성이 꺼져 있는 경우에는

조판부호의 위치가 표와 떨어져 있는 경우가 있기 때문에

겉으로 볼 때에는 표 옆에 커서를 두고 hwp.FindCtrl()을 실행하지만

표가 선택되지 않는 경우가 있기도 합니다.

 

2. 대안 : "SelectCtrlFront" / "SelectCtrlReverse"

가급적 hwp.FindCtrl() 대신 명시적으로 문서의 끝방향, 또는 시작방향으로

가장 먼저 만나는 컨트롤을 선택하는 Run메서드인

SelectCtrlFront / SelectCtrlReverse 를 사용해주시기 바랍니다.

커서의 전방/후방으로 컨트롤을 탐색하는 명령어는 각각 아래와 같습니다.

녹화_2024_09_29_16_44_53_462.gif

 

hwp.HAction.Run("SelectCtrlFront")  # 문서의 끝방향으로 탐색
hwp.HAction.Run("SelectCtrlReverse")  # 문서의 시작방향으로 탐색

저도 최근에는 FindCtrl 대신 대부분의 경우 위의 SelectCtrl~ 코드를 활용하고 있습니다.

 

3. 문서의 첫 번째 표를 선택하는 방법

가장 확실한 방법은 hwp.HeadCtrl이나 hwp.LastCtrl에서부터 순차탐색하는 것입니다.

아래의 코드는 문서의 target번째 표를 선택합니다.

녹화_2024_09_29_19_01_08_966.gif

 

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

 

4. 또는 pyhwpx 설치를 추천~

컨트롤을 선택하는 다소 간단한 기능인데도 위의 코드는 상당히 깁니다..

pyhwpx 모듈을 설치하시면 아래와 같은 단축코드를 사용하실 수 있습니다.

녹화_2024_09_29_19_08_33_65.gif

 

from pyhwpx import Hwp

hwp = Hwp()

# target번째 표의 첫 번째(A1) 셀로 이동
target = 2
hwp.get_into_nth_table(target)

# A1셀 안에서 아래 코드를 실행하면 표 전체를 선택함
hwp.SelectCtrlFront()

 

참고 : 모든 표의 폰트를 휴먼명조, 크기 30pt, 이탤릭으로 변경하기

녹화_2024_09_29_19_23_26_673.gif

 

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() 메서드를 사용하여 표를 선택하는 과정에서 문제가 발생하는 것 같네요. 커서 위치가 맞아야만 표를 제대로 선택할 수 있는 상황이라 불편함을 겪고 계시는 것을 확인했습니다. 이에 대한 해결책을 제시해드릴 링크와 답변을 제공해 드립니다.

우선, 비슷한 문제에 대한 답변이 제공된 두 가지 예시를 참고해 보시면 도움이 될 것입니다:

  1. 표 내부 진입이 안되는 경우
  2. 8강 표 복사가 안되네요

위 링크들의 답변에서 hwp.SetPosBySet() 메서드를 사용하는 방법과 헤드나 열고 루프를 통해 표를 찾아서 이동하는 방법을 확인할 수 있습니다.

해결 방법 요약:

  1. 헤드 컨트롤을 사용하여 표의 위치를 찾기
  2. hwp.SetPosBySet() 메서드를 이용하여 커서를 이동시키기

다음은 hwp.SetPosBySet()와 함께 표를 정확히 선택하는 코드 예시입니다:

# 표의 첫 번째 위치로 커서를 이동합니다.
hwp.SetPosBySet({"row": 0, "col": 0})

# 표를 찾습니다.
hwp.FindCtrl()

# 표 내부 셀을 선택합니다.
hwp.Run('ShapeObjTableSelCell')

추가 설명:

  • 먼저, SetPosBySet를 통해 커서의 위치를 정확히 지정한 후 FindCtrl를 호출하여 표를 찾습니다.
  • 표가 잘 선택되지 않는다면, MovePos(2)를 사용하여 문서의 시작 위치로 커서를 이동해 보세요.
# 문서 시작 위치로 커서 이동
hwp.MovePos(2)  

이 방법들을 시도하시면 커서 위치에 상관없이 정확한 표 선택을 할 수 있을 것입니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

ㅇㅅㅇ님의 프로필 이미지
ㅇㅅㅇ

작성한 질문수

질문하기