PyQt5에서 버튼을 누르면 MainWindow를 새로 그리고 싶습니다.

조회수 1823회

현재까지 만들어진 결과물의 캡처사진을 띄워 설명하겠습니당 이미지 이미지 아래의 사진이 제가 원하는 결과입니다. 프로그램을 굳이 종료하고 재시작하지 않아도 Dialog의 Ok버튼을 누르면 바로 아래처럼 window가 다시 그려지도록 해주고싶어요.. 추가로, '기록 추가'버튼을 누르면 Month Goal의 ProgressBar들의 값들도 다시 그려지게 하고 싶은데 그 부분은 제가 좀 더 찾아보고 공부해보겠습니다ㅠㅠ 이미지 아래에 부분적인 코드들을 첨부할게요 먼저 Daily Check를 구현하는 메서드입니다. initUI 내에서 호출됩니다.

//여기에 코드를 입력하세요
    def initDaily(self):
        vbox_daily = QVBoxLayout()
        self.list_daily = list()

        lb_daily_title = QLabel('Daily Check', self)
        lb_daily_title.setGeometry(20, 20, 200, 50)
        lb_daily_title.setStyleSheet(
            "color: #FA8072;"
            "font-weight: 200;"
            "font-size: 30px"
        )

        height = 100
        header = self.dailyHeader()

        for i in header:
            if i != 'date':
                lb = QLabel(i, self)
                lb.move(30, height)
                lb.setStyleSheet("color: black;"
                                 "font-size: 18px;"
                                 "font-weight: 200;")

                self.lineEdit = QLineEdit(self)
                self.lineEdit.move(130, height)
                self.lineEdit.setText('0')

                self.list_daily.append(self.lineEdit)
                vbox_daily.addWidget(lb)
                vbox_daily.addWidget(self.lineEdit)
                height += 50


        btn_daily = QPushButton('기록 추가', self)
        btn_daily.move(75, height)
        btn_daily.clicked.connect(self.addDaily)

        return vbox_daily

그리고 아래는 initDaily 내에서 호출되거나 이벤트핸들러로 사용되는 dailyHeader()와 addDaily()입니다. 대충 dailyHeader는 DB에 저장된 운동 항목의 이름들을 리스트에 담아서 반환하는 함수입니다. addDaily는 QLineEdit의 값들을 DB에 추가합니다.

//여기에 코드를 입력하세요
    def dailyHeader(self):
        result = []
        db = pymysql.connect(host='localhost', port=3306, user='root', passwd='***********', db='exercise', charset='utf8')
        c = db.cursor()
        c.execute('desc daily_chart')
        db.commit()

        rows = c.fetchall()
        for item in rows:
            result.append(item[0])

        result = result[0:-2]
        db.close()

        return result


      def addDaily(self):
        str_value = ''
        for i in self.list_daily:
            str_value += i.text() + ','

        print(str_value[0:-1])

        db = pymysql.connect(host='localhost', port=3306, user='root', passwd='***********', db='exercise', charset='utf8')
        c = db.cursor()
        c.execute(
            'insert into chart values('+str_value[0:-1]+',%s)', (int(QDate.currentDate().toString('yyMMdd')))
            )
        db.commit()
        db.close()

다음은 '운동 항목 추가' 버튼과 이벤트 처리 함수들입니다.

//여기에 코드를 입력하세요
        btn_add = QPushButton('운동 항목 추가', self)
        btn_add.setGeometry(500, 500, 300, 100)
        btn_add.clicked.connect(self.addExercise)



    def addExercise(self):
        text, ok = QInputDialog.getText(self, "운동 항목 추가", "운동 이름을 입력해주세요")

        if ok:
            self.addExerciseToDB(str(text))
//여기에 코드를 입력하세요
    def addExerciseToDB(self, element):
        db = pymysql.connect(host='localhost', port=3306, user='root', passwd='*', db='exercise', charset='utf8')
        c = db.cursor()
        c.execute('alter table daily_chart add column '+element+' int default(0) first')
        db.commit()

        db.close()

마지막으로 다루는 DB의 Table들입니다. 이미지 이미지

도움이되는 내용을 찾기가 어려워서 질문으로 올립니다ㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자
  • 제가 pyqt5를 써보지 않아서 잘 모르겠는데 기본적으로 UI 업데이트를 해주는 함수가 있을 듯 합니다. 잠깐 찾아본 바로는 processEvents() 나 repaint() 함수가 있다고 하는데 좀 더 검색해 보시면 답을 얻을 수 있지 않을까요? 알 수 없는 사용자 2019.9.4 11:40

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)