안녕하세요?


지난번 포스팅에서 유저 인터페이스의 기초까지는 완성을 했는데, 이제 하나하나 제대로 작동을 하도록 만들어 가야 하는 단계가 왔습니다. 어쩌면 진짜로 프로그램을 만든다는 것은 여기서 부터 시작을 하는 것인지도 모르겠다는 생각이 듭니다. 아무튼 그 기나긴 작업의 시작이 되는 과정을 지금부터 들어가 보고자 합니다.



먼저 main.py를 위 스크린샷과 같이 코드를 짜 주도록 합니다. 코드의 내용은 pushButton이라는 제일 처음에 추가한 버튼인 데이터 베이스 지정 이라는 버튼을 누르면, Selection_of_Database()라는 메소드가 작동되도록 만들었습니다. 그런데 여기서 중요한 것은 기존에 폴더를 지정하는 것과는 다르게 파일은 getOpenFileName()이라고 하는 QFileDialog안에 속해 있는 메소드를 이용한다는 것 입니다.



그런데 이런 형식만으로는 만족할 수 없어서, self뒤에 위 스크린샷처럼 '????????','./'.'databaseFile(*.db)'라는 것을 붙여 주어서 다른 모든 폴더를 볼수는 있되, 오로지 데이터 베이스 파일인 db가 확장자인 파일만 보이도록 만들 수 있습니다. 이로서 엉뚱한 파일이 선택되는 것을 방지할 수 있습니다.



실제로 RLTrader를 실행시켰을 때, 위 스크린샷처럼 진짜로 데이터 베이스의 파일만이 보이는 것을 볼 수 있습니다. 이로서 일단의 작업은 완료가 된 것을 볼 수 있습니다.



그런데 데이터 베이스 파일을 지정하면 위 스크린샷처럼 에러가 뜨는 것을 볼 수 있습니다. 이런 이유로 인해서 어딘가 코드에 에러가 있다는 것을 알 수 있습니다.




그래서 각각의 줄마다 print()함수를 사용해서 표식을 남겨 놓도록 했으며, 위 스크린샷에서 보이는 것처럼, 2번째 줄까지만 어떻게 실행이 되는 것을 확인할 수 있었습니다.



아무래도 경로를 지정하기 위한 os.path.realpath()가 에러를 일으킨 원인으로 보여서, 일단 저 QFileDialog.getOpenFileName()메소드를 이용해서 가지고 온 값이 도대체 무엇인지 알아 보고자 합니다.



그러자 위 스크린샷처럼 쉼표(,)를 기준으로 나눌 수 있다는 것을 알 수 있습니다. 그래서 이번에는 앞만 남기고 뒤는 버리도록 하고자 합니다.



이번에는 str()함수를 이용해서 문자열로 만들도록 하고, 쉼표를 이용해서 중간에 자르도록 합니다. 그리고 뒤에 [0]이라는 것의 의미는 인덱스  0인 부분의 문자, 즉 쉼표를 기준으로 해서 자른 앞쪽의 0번째 문자열을 가지고 오라는 의미가 됩니다.




그런데 자른 것 까지는 좋았는데, 문제는 경로 앞에 (이 있어서 어떻게 쓸 수 없다는 생각이 들었습니다. 이래서야 상당히 문제가 있다면 문제가 있다는 생각이 듭니다.



그래서 이번에는 abspath()라는 함수를 이용해서 절대경로로 바꾸어 주도록 합니다.



그렇게 하고도, (라는 문자열을 어떻게 바꿀 수 없었습니다.



그래서 이번에는 그냥 변수2 = 변수1[0] 라는 형식으로 만들어 주도록 합니다. 왜냐하면 QFileDialog.getOpenFileName()이라는 메소드로 나오는 결과는 튜플이라는 형식으로 나오는데, 그래서 튜플에서는 인덱스 0번째 값인 경로를 가지고 오라는 명령을 내려야 합니다.



다음으로는 이 지정된 내용이 눈으로 볼 수 있어야 하는데, 그 방법으로는 아래에 있는 lineEdit이라는 위젯의 텍스트를 위 스크린샷처럼 setText()라는 식으로 적어 주어야 합니다.



그리고 실제로 해 보니까 위 스크린샷처럼 나오는 것을 볼 수 있었습니다. 일단 첫 단계는 어떻게 제대로 끝났다는 생각이 들기는 드는 중 입니다. 그래서 다음으로는 다른 위젯에서 설정한 내용을 하나하나 만들어 가야 겠다는 생각이 듭니다. 그래서 다음으로는 데이터 베이스의 테이블을 얻어오는 과정이 될 듯 합니다.

  1. 모르 2020.09.09 17:30

    저는 외관상 label 바꿔서 했습니다. 간단한 방법 공유 합니다.
    def Selection_Database(self):
    dataBasePath = QFileDialog.getOpenFileName(self, self.tr("Open Data files"), "./", self.tr("Data Files (*.db)"))
    self.label_4.setText(dataBasePath[0])

    2일 동안 찾았습니다... ㅠㅠ

    • 안녕하세요?

      오오 이런방법이 있는 줄은 저도 몰랐습니다.
      확실히 프로그램 만들기는 외워서 하는게 아니라, 하나하나 알아가기라더니, 그게 사실인가 봅니다. 좋은 방법 감사합니다.

+ Recent posts