본문 바로가기
IT

파이썬 - 입력값 확인, 엑셀 비교 프로젝트

by 소혜민 2025. 2. 3.
반응형

많은 부분이 준비가 되었습니다. 세 개의 버튼을 이용해서 원본파일과 비교할 파일 그리고 출력할 파일을 모두 선택했습니다. 그러면 옵션을 선택하고 마지막으로는 비교실행 버튼을 눌러 프로그램을 시작시켜야겠죠. 그런데 우리의 의도와는 다르게 세개의 파일을 모두 선택하지 않은 상태에서 비교실행을 누른다면 어떻게 될까요?

아직 프로그램 코딩을 하지는 않았지만 하게 된다면 원하는 파일이 없으니 에러가 발생할 것입니다. 그래서 실행 버튼을 누르면 처음에 하는 것이 바로 내가 필요한 입력값들이 모두 입력이 되었는지를 확인하는 과정이 필요합니다. 이번에는 그 과정을 살펴보도록 하겠습니다. 

 

검토를 해 봐야 할 것은 눈에 보이는 위젯 중에서 Line Edit 위젯 세개와 라디오 버튼 두 개가 있습니다. 이 중에서 라디오 버튼의 경우 프로그램을 시작하면서 고정 포맷으로 자동으로 설정이 될 수 있겠끔 click()함수를 이용해서 선택이 되도록 해 놨습니다. 따라서 파일의 경로와 이름이 들어갈 Line Edit 위젯 세개만 확인을 하면 됩니다. 바로 앞서 배운 파이썬 기본 패키지 os를 이용하는 방법은 os.path.isfile() 함수에 매개변수로 파일경로와 파일 이름이 함께 들어간 변수를 넘겨서 확인하는 방법이 있습니다. 파일이 있다면 True, 없다면 False를 돌려 줍니다. 하지만 출력파일은 파일이 없는데 출력용으로 생성할 것이라는 의미이기 때문에 이 함수를 이용해서는 안됩니다. 경로 정도는 확인을 할 수 있겠네요.

 

또 다른 방법은 Line Edit가 입력을 받을 수 없는 상태이기 때문에 해당 위젯의 텍스트가 들어 있으면 파일 경로가 있다는 것으로 파악하는 방법입니다. 쉽고 간단하게 처리를 할 수 있겠습니다. 

 

그러면 이런 문제가 있을 경우에는 어떤 방법으로 사용자에게 알림을 주는 것이 좋을까요? 터미널에 메시지를 보여줄 수도 없으니 아마도 메시지 박스가 가장 쉬운 방법이 아닐까 싶습니다. 우리는 이 두 가지 방법을 사용해서 정보가 제대로 들어 있는지 확인하고 없다면 메시지 박스를 이용해서 사용자에게 정보를 공유하는 방법으로 코딩을 진행해 보겠습니다. 

 

다음은 원래 소스코드 중에서 변경되거나 추가된 내용만 발췌를 했습니다.  QMessageBox 패키지는 012_messagebox2.py에서 이미 한번 다뤘으니 소스코드를 참고해도 좋겠습니다. QMessageBox의 사용을 위해서 먼저 import를 하고 시작합니다.

 

049_excelComp4.py

 import sys

 from PySide6.QtWidgets import QApplication, QMainWindow, QFileDialog, \

       QMessageBox

 from excelComp import Ui_Dialog

 

 # from 012_messagebox2.py ################################

  def showMsgBox(self, wndTitle, title, info, icon, btns, dbtn):

  msgbox = QMessageBox()

  msgbox.setWindowTitle(wndTitle)

  msgbox.setText(title)

  msgbox.setInformativeText(info)

  msgbox.setIcon(icon)

  msgbox.setStandardButtons(btns)

  msgbox.setDefaultButton(dbtn)

 

  return msgbox.exec()

 

 ########################################################

 

 

showMsgBox() 함수는 QMessageBox()를 쉽게 사용하기 위해서 만든 함수입니다. msgbox에 QMessageBox()를 할당합니다. setWindowTitle() 함수는 메시지박스 윈도우의 타이틀을 지정하고 setText() 함수는 메시지박스 내의 메시지에 대한 제목을 setInformativeText() 함수는 메시지 박스에 상세한 메시지 내용을 지정합니다. 다음은 setIcon() 함수를 통해서 메시지 박스 좌측에 아이콘을 지정할 수 있습니다. 여기에 들어갈 수 있는 아이콘은 QMessageBox.Warning, Question, Information, Critical의 네 가지를 지정할 수 있습니다. 다음은 setStandardButtons() 함수를 이용해서 버튼들을 설정해 줄 수 있습니다. 버튼의 종류는 Ok, Open, Save, Cancel, Close, Discard, Apply, Reset, RestoreDefaults, Help, SaveAll, Yes, YesToAll, No, NoToAll, Abort, Retry, Ignore, NoButton을 지정할 수 있습니다. 하나만 지정하는 것이 아니라 여러 개도 지정가능한데 버튼을 ‘|’로 연속해서 지정해 주면 됩니다. Yes와 No 버튼을 표시하고 싶다면 QMessageBox.Yes | QMessageBox.No와 같이 지정을 합니다. 마지막에는 setDefaultButton()이 있습니다. 이 함수는 하나의 버튼을 지정해 줍니다. 여러개의 버튼들 중에서 어느 버튼에 포커스를 가지게 할 것인가를 지정합니다.  포커스를 갖는다는 것은 메시지박스가 나타나고 두 개 이상의 버튼이 있을 때, 버튼 주변이 파란색으로 되어 있는 버튼을 이야기 하며 이 상태에서 엔터나 스페이스바 버튼을 눌렀을 때 마우스로 해당 버튼을 클릭하는 효과를 가져오게 됩니다.

 

다음은 엑셀을 비교하기 전에 조건들을 검사하는 과정입니다. 모든 파일들의 경로가 제대로 입력이 되었는지를 확인하고 제대로 입력이 되지 않았다면 메시지박스를 출력하고 pbExecClick() 함수의 다음을 실행하지 않고 종료를 시킵니다.

다음은 라디오 버튼을 확인해서 고정포맷이나 구분코드 쪽을 선택하게 됩니다. 

 

 

  def pbExecClick(self):

  if len(self.leOri.text()) < 5 or \

               len(self.leComp.text()) < 5 or \

    len(self.leOut.text()) < 5:

 

  self.showMsgBox("에러",

                            "파일 입력 오류",

                                  "파일이 모두 선택되거나 입력되지 않았습니다.",
                                  QMessageBox.Warning

                                  QMessageBox.Ok,

                                  QMessageBox.Ok)

                   return

 

  if self.rbKey.isChecked():

  print("구분코드 엑셀 비교 실행")

  else:

  print("고정포맷 엑셀 비교 실행")

 

여기선 len()이라는 파이썬이 내장 함수를 이용해서 각 Line Edit 위젯에서 text()를 뽑아서 길이를 확인하는 것으로 조건 검사를 합니다. 각 조건에서 텍스트의 길이가 5보다 작은 경우, 세 개 중에서 하나라도 길이가 5보다 작은 경우에 대해서 메시지박스를 출력합니다. 출력 파일은 파일이 존재하지 않기 때문에 검사가 안되지만  원본파일과 비교파일의 경우엔 파이썬 os.path 패키지를 써서 확인할 수 있습니다. isfile() 함수입니다. 즉 os.path.isfile()로 파일이 있으면 True, 없으면 False를 반환하는 함수입니다. 하지만 QFileDialog에서 파일을 선택하도록 되어 있기 때문이니 정확한 파일명이 들어왔다는 가정하에 값이 들어왔는지를 확인하기 위해서 길이만 체크를 합니다. if 조건문이 총 세개가 있고 각 조건문은 or로 연결을 합니다. 즉, 세 개의 조건 중에서 어느 하나라도 맞으면 메시지 박스를 사용자에게 보여주고 그 다음엔 return을 통해서 그 이하의 함수는 실행하지 않고 끝내게 됩니다. 

 

다음 if 문에서는 rbKey가 체크가 되어 있는지를 isChecked() 함수를 통해서 확인을 합니다. 체크가 되어 있다면 구분코드로, 그렇지 않다면 고정 포맷 부분을 터미널에 출력하게 됩니다. 우리는 이 조건에 따라서 어떤 프로그램을 실행할지 선택이 됩니다. 

 

이젠 실제 엑셀을 비교하는 루틴을 개발할 차례입니다.



반응형

댓글