해결된 질문
작성
·
504
·
수정됨
1
강의를 보고 나서...한글서식을 자동하는것을 구현(단순 입력 수준이지만..ㅎㅎ) 해보고 있습니다.
자주쓰는 문서 서식을 자동입력하기 위해...파이썬으로 점끌기 탭을 구현하려고 합니다..
한글에서 스트립트 녹화해서...파이썬으로 코드를 옮겼는데....
에러는 안나는데...한글에 적용이 안됩니다...
hwp.HAction.GetDefault("ParagraphShape", hwp.HParameterSet.HParaShape.HSet)
hwp.HParameterSet.HParaShape.TabDef.CreateItemArray("TabItem", 3)
hwp.HParameterSet.HParaShape.TabDef.TabItem.SetItem(0, hwp.MiliToHwpUnit(200))
hwp.HParameterSet.HParaShape.TabDef.TabItem.SetItem(1, 3)
hwp.HParameterSet.HParaShape.TabDef.TabItem.SetItem(2, 1)
hwp.HAction.Execute("ParagraphShape", hwp.HParameterSet.HParaShape.HSet)
Item(0)은 탭크기(? 위치), Item(1)은 탭선 종류, Item(2)는 방향(? 왼쪽, 오른쪽 등)으로 세개가 한세트라는 것까지는 한글API메뉴얼을 보고 확인은 했는데...
혹시나 MiliToHwpUnit()가 잘못됐나 싶어서..그냥 일반 숫자로 40000으로 입력도 해보고 해도..
해답을 못찾았습니다..
혹시 문제가 있는 부분을 알려 주실수 있을런지요? ㅜㅜ
답변 2
1
안녕하세요?
제가 강의 중간에 너무 얄팍하게 다뤄서, 이 부분이 아직 생소하신 것 같습니다ㅜㅜㅜ
> 다른 분들도 이 질문을 많이 참고하시면 좋겠어요...
스크립트녹화 코드가 잘 작동하지 않는 경우
파라미터셋과 서브셋을 모두 변수로 지정해야만
잘 동작하는 경우가 더러 있습니다.
질문 주신 경우도 그런 대표적인 경우인데요.
아래와 같이 실행해보시면 잘 작동할 것입니다.
Set = hwp.HParameterSet.HParaShape
hwp.HAction.GetDefault("ParagraphShape", Set.HSet)
tab_def = Set.TabDef
tab_def.CreateItemArray("TabItem", 3)
tab_def.TabItem.SetItem(0, 80000)
tab_def.TabItem.SetItem(1, 3)
tab_def.TabItem.SetItem(2, 0)
hwp.HAction.Execute("ParagraphShape", Set.HSet)
참고로, tab_def
변수는 GetDefault
라인 실행 이후에 선언해야 합니다. 그렇지 않으면 제대로 실행되지 않습니다.
저도 굉장히 오랜 시행착오를 거쳐 알게 된 부분인데, 유독 파이썬에서만 이렇게 코딩해야 하는 것 같습니다.
정확한 이유는 잘 모르겠지만,
아마 Set이나 tab_def 같은 변수를 지정하지 않으면
매번 SetItem으로 값을 대입할 때마다 Action과 상관없는 임의의 메모리주소에 (랜덤하게) 들어가버리는 거라고 짐작해봅니다.
답변이 도움이 되었길 바랍니다ㅎㅎㅎ
일코님께서 작성해주신 코드 사용 시,
기존에 사용 하던 문서에 적용은 안되는건가요??
import win32com.client as win32
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject") # 한/글을 파이썬으로 실행. 에러나면 gen_py 폴더 삭제
hwp.XHwpWindows.Item(0).Visible = True # 한/글 프로그램의 백그라운드 숨김을 해제하는 코드
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule") # 보안모듈
로 새 한글 문서를 연 후, 문의사항을 통해 알려주신 코드를 실행시킬 경우에만 작동이 되더라고요
형주님 안녕하세요?
win32나 pyhwpx 둘 중 어느 걸로 한/글을 여셨든지
HAction과 HParameter를 이용한 매크로 실행은
동일한 코드로 적용하실 수 있습니다.
(다만.. 최신업데이트를 해 주셔야 합니다ㅜ : pip install --upgrade pyhwpx
)
현재 최신버전은 0.10.20 입니다.
from pyhwpx import Hwp
# 한/글 실행
hwp = Hwp()
# 글자크기 설정(40 pt)
hwp.set_font(Height=40)
# 텍스트 삽입
hwp.insert_text("A\t1\r\nB\t2\r\nC\t3\r\nD\t4\r\n")
# 점끌기 탭 구현
hwp.SelectAll()
Set = hwp.HParameterSet.HParaShape
hwp.HAction.GetDefault("ParagraphShape", Set.HSet)
tab_def = Set.TabDef
tab_def.CreateItemArray("TabItem", 3)
tab_def.TabItem.SetItem(0, 80000)
tab_def.TabItem.SetItem(1, 3)
tab_def.TabItem.SetItem(2, 0)
hwp.HAction.Execute("ParagraphShape", Set.HSet)
hwp.Cancel()
import win32com.client as win32
# 한/글 실행
hwp = win32.gencache.EnsureDispatch("hwpframe.hwpobject")
hwp.XHwpWindows.Item(0).Visible = True
# 글자크기 조절(40 pt)
pset = hwp.HParameterSet.HCharShape
hwp.HAction.GetDefault("CharShape", pset.HSet)
pset.Height = 40 * 100
hwp.HAction.Execute("CharShape", pset.HSet)
# 텍스트 삽입
pset = hwp.HParameterSet.HInsertText
hwp.HAction.GetDefault("InsertText", pset.HSet)
pset.Text = "A\t1\r\nB\t2\r\nC\t3\r\nD\t4\r\n"
hwp.HAction.Execute("InsertText", pset.HSet)
# 점끌기 탭 구현
hwp.Run("SelectAll")
Set = hwp.HParameterSet.HParaShape
hwp.HAction.GetDefault("ParagraphShape", Set.HSet)
tab_def = Set.TabDef
tab_def.CreateItemArray("TabItem", 3)
tab_def.TabItem.SetItem(0, 80000)
tab_def.TabItem.SetItem(1, 3)
tab_def.TabItem.SetItem(2, 0)
hwp.HAction.Execute("ParagraphShape", Set.HSet)
hwp.Run("Cancel")
보시다시피 "점끌기 탭 구현" 코드 부분은 동일합니다^^
1
안녕하세요 배재완 님, 인프런 AI 인턴이에요.
한글 점끌기 탭을 구현하려고 파이썬 코드를 작성하셨는데, 적용이 안되는 문제로 고민 중이시군요. 코드를 보니 실행에는 문제가 없어 보입니다. 그런데 문제가 발생하는 부분을 파악하기 위해서는 더 많은 정보가 필요합니다.
위의 정보를 제공해 주시면 더 정확한 도움을 드릴 수 있을 것 같습니다. 감사합니다!
코드 실행시 에러는 발생하지 않습니다. 다만 한글에 해당 기능(점끌기탭)이 수행되지 않습니다.
한글 2020사용중이며, API 메뉴얼은 한글과컴퓨터 홈페이지에 현재 게시되어 있는 API 메뉴얼 참고 했습니다.
문서의 목차 서식에 적용할려고 합니다.
^^ 앗..해법을 찾지 못해 한동안 손 놓고 있었는데....
답변 감사합니다...^^
차라리 첨부터 해법처럼..set을 지정해서 사용하는 방법으로 습관을 들리도록 하겠습니다...^^
좀 쉽게 가볼려다....역시 정공법이 최고네요..ㅋㅋ
추신: ㅋㅋ..다른 안되던 기능인..글라데이션도 이것으로 해결되었네요..감사합니다.
앞으로 그냥 이폼으로 작성토록 하겠음당..^^