해결된 질문
작성
·
43
답변 3
1
0
sannim12님 안녕하세요?
제가 오해를 하시게끔 글을 써두었네요ㅜ 죄송합니다ㅜㅜㅜ
파일선택창이 뜨지 않은 이유는
아마 가장 처음의 함수정의 부분 코드만 실행하신 듯 합니다.
강의코드를 따라치지 마시고 (읽기만 하시다가)
실행은 마지막 부분에 완성된 코드만,
이제 모든 재료가 준비되었습니다.
적절하게 코드를 종합해보면 아래와 같은 코드가 만들어집니다.
라는 글 아래에 있는, 완성된 코드블록만 실행하셔야 합니다.
import datetime as dt
import os
from math import ceil
from tkinter import Tk
from tkinter.filedialog import askopenfilename
import win32com.client as win32
def 엑셀파일선택():
win = Tk() # GUI 실행하고
win.withdraw()
xlsx = askopenfilename(title="데이터가 들어있는 엑셀파일을 선택해주세요.",
initialdir=os.getcwd(),
filetypes=[("엑셀 또는 한셀파일", "*.xlsx *.xls *.cell")])
win.quit() # GUI 종료
return xlsx
def 한글파일선택():
win = Tk() # GUI 실행하고
win.withdraw()
hwpx = askopenfilename(title="한/글 서식파일을 선택해주세요.",
initialdir=os.getcwd(),
filetypes=[("한/글파일", "*.hwp *.hwpx")])
win.quit() # GUI 종료
return hwpx
def 콘솔경로이동(path):
os.chdir(path.rsplit("/", maxsplit=1)[0]) # 파일경로로 콘솔 이동
def 엑셀열기(xlsx):
excel = win32.dynamic.Dispatch("Excel.Application") # 엑셀프로그램 열기
excel.DisplayAlerts = False # 경고팝업 무시
wb = excel.Workbooks.Open(xlsx) # 엑셀파일 열기
ws = wb.Worksheets(1) # 엑셀시트(1) 지정
excel.Visible = False
return excel, ws
def 한글열기(hwpx):
hwp = win32.dynamic.Dispatch("HWPFrame.HwpObject") # 한/글 열기
hwp.XHwpWindows.Item(0).Visible = True # 한/글 백그라운드 해제
hwp.RegisterModule("FilePathCheckDLL", "FilePathCheckerModule")
hwp.Open(filename=hwpx, Format="", arg="") # 한/글 파일 열기
return hwp
def 한글_텍스트입력(text):
hwp.HAction.GetDefault("InsertText", hwp.HParameterSet.HInsertText.HSet)
hwp.HParameterSet.HInsertText.Text = text
hwp.HAction.Execute("InsertText", hwp.HParameterSet.HInsertText.HSet)
def 엑셀종료():
excel.Quit()
def 다른이름으로저장(path):
hwp.SaveAs(Path=path, Format="HWP", arg="")
if __name__ == '__main__':
엑셀파일 = 엑셀파일선택()
콘솔경로이동(엑셀파일)
excel, ws = 엑셀열기(엑셀파일)
한글파일 = 한글파일선택()
hwp = 한글열기(한글파일)
엑셀데이터 = ws.UsedRange()[1:] # 제목행 제외
엑셀종료()
입력건수 = len(엑셀데이터)
올해 = dt.date.today().year
이번달 = dt.date.today().month
분기 = ceil(이번달 / 3) # 예: ceil(4/3) == 2
오늘 = dt.date.today().day
hwp.PutFieldText('count', 입력건수)
hwp.PutFieldText('year', 올해)
hwp.PutFieldText('year_below', 올해)
hwp.PutFieldText('quarter', 분기)
hwp.PutFieldText('month', 이번달)
hwp.PutFieldText('day', 오늘)
hwp.SetPos(22, 0, 0) # 입력할 첫 번째 셀로 이동
for 행인덱스, 행데이터 in enumerate(엑셀데이터):
사전전보승인일, 직급, 전보대상자, 전보일, 기존부서, 전보부서, 근무시작일, 근무종료일, 근무기간, 전보유형 = 행데이터
사전전보승인일 = dt.datetime.strptime(사전전보승인일, "%Y-%m-%d").strftime("'%y.%m.%d") # yyyy-mm-dd 포맷을 'yy.mm.dd 포맷으로 바꿈
전보일 = dt.datetime.strptime(전보일, "%Y-%m-%d").strftime("'%y.%m.%d") # 'yy.mm.dd 서식으로 바꿈
근무시작일 = dt.datetime.strptime(근무시작일, "%Y-%m-%d").strftime("'%y.%m.%d") # 'yy.mm.dd 서식으로 바꿈
근무종료일 = dt.datetime.strptime(근무종료일, "%Y-%m-%d").strftime("'%y.%m.%d") # 'yy.mm.dd 서식으로 바꿈
근무기간 = 근무기간.split("월")[0] + "개월" # y년m개월 서식으로 바꿈
최종근무기간 = f"{근무시작일}~{근무종료일}\n({근무기간})"
입력용리스트 = [사전전보승인일, 직급, 전보대상자, 전보일, 기존부서, 전보부서, 최종근무기간, 전보유형] # 입력용 리스트 생성
for 열인덱스, 셀값 in enumerate(입력용리스트, start=1):
한글_텍스트입력(셀값) # 모든 열의 데이터를 차례로 입력하다가
if 열인덱스 < 8: # 한 열씩 입력하고
hwp.Run("TableRightCell") # 다음 열로 이동(입력계속)
if 행인덱스 < 입력건수 - 1: # 마지막 행에 도착하기 전까지는
hwp.Run("TableAppendRow") # 입력완료 후 빈 행 추가
hwp.Run("TableColBegin") # 생성한 행의 첫 번째 열로 이동(입력계속)
결과파일명 = f"필수보직기간 내 전보 사전승인 통보서#{올해}년{분기}분기.hwp"
결과물경로 = os.path.join(os.getcwd(), 결과파일명)
다른이름으로저장(결과물경로)
그 위의 코드들은 전부 일부 기능의 구현 및 정의일 뿐이고,
정작 실행하는 코드는 포함되어 있지 않기 때문입니다.
파일선택 창이 뜨게 하는 코드는, 마지막 코드블럭의
if __name__ == '__main__':
엑셀파일 = 엑셀파일선택() # <--------
콘솔경로이동(엑셀파일)
excel, ws = 엑셀열기(엑셀파일)
한글파일 = 한글파일선택() # <---------
hwp = 한글열기(한글파일)
화살표 표시된 두 라인입니다. (하나는 엑셀파일 선택, 하나는 한/글파일 선택)
이 강의 전체적으로, 갈수록 어려워지거나 복잡해지는 강의가 아니라서
이번 예제가 다소 어렵게 느껴지신다면 (실제로도 가장 어렵고요ㅜㅜㅜㅜ)
건너뛰셔도 완전히 괜찮습니다.
참고로, 동일한 예제파일을 가지고
최근에 위키독스에 업데이트해서 올린 적이 있었는데,
관심있으시다면 해당 챕터만 참고해보셔도 좋을 것 같습니다.
(현재 읽고 계신 챕터보다는 조금 더 상세하게 설명을 적었습니다.)
위키독스에 작성중인 무료e북 일부입니다.
자주 질문 남겨주세요!!!
도움이 되어드리고 싶습니다.
행복한 하루 되세요^^
0
안녕하세요, 인프런 AI 인턴입니다. sannim12님.
파일 선택 다이얼로그를 사용하려 할 때 창이 뜨지 않는 문제는 여러 가지 원인이 있을 수 있습니다. 기본적인 원인과 해결 방안을 몇 가지 소개해드릴게요.
Tkinter 사용 시 메인 루프 누락: 파일 선택 다이얼로그를 사용하기 위해 Tkinter
모듈을 사용할 때, Tk()
객체 생성 및 mainloop()
의 실행이 필요합니다. 다이얼로그 실행 전에 Tk 객체를 생성하고, 필요시 mainloop()
도 정의되어 있는지 확인해 보세요.
이벤트 루프 위반: 파일 다이얼로그는 일반적으로 그래픽 사용자 인터페이스(GUI)에 종속됩니다. GUI 애플리케이션에서는 mainloop()
가 실행되고 있어야 하며, 특정 GUI 환경 내에서 발생하는 동안만 효율적으로 작동합니다.
파일 다이얼로그 실행 경로 확인: 다이얼로그를 실행하는 함수가 올바른 경로에서 호출되고 있는지 확인하세요. 잘못된 순서나 경로로 인해 함수가 호출되지 않는 경우도 있습니다.
파이썬 환경 문제: 가상 환경이나 파이썬 설치에 문제가 있어 Tkinter 모듈이 정상적이지 않을 수 있습니다. 파이썬과 Tkinter 설치를 확인해보고 문제가 있다면 다시 설치해보는 것도 하나의 방법입니다.
이와 같은 예기치 않은 버그에 대해서는 파일 다이얼로그 관련 질문를 확인하시면 도움이 될 수 있습니다. 해당 링크는 파일 다이얼로그와 관련한 다양한 문제 해결 방법을 제시합니다.
저는 질문자님의 이해를 돕고자 기존 답변을 참고하여 유사한 내용을 추천해드리고 있습니다. 현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.
빠른 답변 감사드립니다.^^