파이썬 자기 자신을 계속 값을 증가할때 질문 드립니다.

조회수 956회

예로 스핀박스 gui 값을 올리고 있습니다. 50 150 200 250 이렇게 50기준으로 값이 올라가고 내려가야 하는데...(쇼핑몰 +- 버튼 처럼) 제가 코드를 잘못 짜서인지 50 100 200 400 800 1600 중복으로 값이 더해져 버리는데 ㅜㅜ 이걸 어떻게 바르게 표현하려면 수식을 넣는법이 있을까요?

import sys
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *

class MyApp(QWidget):
    def __init__(self):
        super().__init__()

        self.MyApp()

    def MyApp(self):
        self.resize(500,300)
        self.tableData = [
            ['no1', 'name1', 'spinbox1', '100'],
            ['nn2', 'name2', 'spinbox2', '200'],
            ['no3', 'name3', 'spinbox3', '300'],
            ['no4', 'name4', 'spinbox4', '400'],
            ['no5', 'name5', 'spinbox5', '500']
        ]        
        self.qStandardItemModel = QStandardItemModel()   

        for i in range(len(self.tableData)):
            for j in range(len(self.tableData[0])):
                model = QStandardItem(self.tableData[i][j])              
                self.qStandardItemModel.setItem(i, j, model)   

        self.qTable = QTableView()
        self.qTable.setSelectionBehavior(QTableView.SelectRows)
        self.qTable.setEditTriggers(QTableView.NoEditTriggers)
        self.qTable.setModel(self.qStandardItemModel)   

        for i in range(5):
            self.qSpinbox = QSpinBox()    
            index = self.qTable.model().index(i, 2)
            self.qTable.setIndexWidget(index, self.qSpinbox)

        self.qSpinbox.valueChanged.connect(self.valueChanged)

        vbox = QVBoxLayout(self)
        vbox.addWidget(self.qTable)
        self.setLayout(vbox)  

    def valueChanged(self):
        print(self.qSpinbox.value())

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = MyApp()
    ex.show()
    sys.exit(app.exec_())

예제 코드는 이렇습니다. 스핀박스를 위버튼 누르면 4번째 열값이 더해지고 아래버튼을 누르면 빼지는 것을 구핸하고싶은데 .... 데이터 넣고빼는건 모델로 하는걸 알겠는데... 이 스핀박스 부분에서 쉽게말게 위버튼을 누를때랑 아래버튼을 누를때의 신호를 나눠눈다고 해야할까? 분리해서 구별법을 알고싶어 변수 카피를 사용해서 나눠 구현해봐도 안되어 도움을 요청드립니다. 위버튼을 누르면 더하기가 되고 아래버튼을 누르면 빼기가 되는 아주 간단한것 같으면서valueChanged.connect 신호가 하나로 되어있어 굉장히 어렵네요??? c++에서는 1값과 -1값을 통해 case문으로 구현하는걸 본것같은데... ㅜㅜ 공식 qt에서도 이부분은 없네요

  • 곱하기 2를 했다는 의미 아닌가요? 더하기를 해야죠... a = 0; a += 50 이런것을 물어보는 것 같지는 않은데요. 정영훈 2019.5.18 14:39
  • 혹시 '이전값들이 더해진 값에 50이 더해진다' 인가요? 최진우 2019.5.18 15:08
  • 연산 기호는 += 를 했는데 값이 위에처럼 곱한것처럼 나오는겁니다 ㅜㅜ nate님 말씀처럼 더해진값에 계속 더해지는거라 이걸 수정하려고하는데 생각보다 안되어 수식?적으로 가능한지... 문의 드렸습니다 다크매터 2019.5.19 16:08
  • 작성한 코드를 올려보세요...위젯은 Qt를 사용하나요? 정영훈 2019.5.19 16:41
  • pyqt위젯을 사용합니다. 다크매터 2019.5.19 19:01

2 답변

  • 좋아요

    1

    싫어요
    채택 취소하기

    질문자의 코드는 마지막 spinbox만 connect 됩니다.

    각각의 spinbox 에 connect를 해줘야 합니다. 또한 singlestep 적용을 하여 증가시키면 됩니다.

    for i in range(5):
        self.qSpinbox = QSpinBox()    
        self.qSpinbox.setMinimum(0)
        self.qSpinbox.setMaximum(5000)
        self.qSpinbox.setSingleStep(int(self.tableData[i][3]))
        # self.qSpinbox.setSingleStep(int(self.qTable.model().item(i, 3).text()))    # table에서 얻을때
        index = self.qTable.model().index(i, 2)
        self.qTable.setIndexWidget(index, self.qSpinbox)
        self.qSpinbox.valueChanged.connect(self.valueChanged)    # 위젯마다 connect 를 연결해야 합니다.
    
    • valueChanged 메소드를 아래와 같이 수정합니다.

    sender 를 통해 호출한 위젯을 알 수 있습니다. 즉 아래의 코드는 호출한 spinbox의 값을 얻습니다.

    def valueChanged(self):
            print(self.sender().value())
    
    • 아 정말 좋은 답변 감사드립니다 많은 도움이 되었습니다 다크매터 2019.5.19 21:06
  • 과거에도 Qt 질문을 올리는 듯 하여 Qt 예제 작성해봤습니다.

    아래의 spinbox 부분을 주의깊게 보시면 됩니다.

    import sys
    
    from PyQt5 import Qt, QtCore, QtWidgets
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, QLabel, QSpinBox
    
    
    class Spindemo(QWidget):
        '''
        QSpinBox Sample
        '''
        def __init__(self):
            super(Spindemo, self).__init__()
            vbox = QVBoxLayout()
    
            self.label = QLabel()
            vbox.addStretch(1)
            vbox.addWidget(self.label)
    
            self.spinBox = QSpinBox(self)
            self.spinBox.setMinimum(0)            # 스핀박스의 최소값 셋팅
            self.spinBox.setMaximum(1000)    # 스핀박스의 최대값 셋팅
            self.spinBox.setSingleStep(50)        # 스핀박스의 스텝당 할당 값 50씩 증감 혹은 차감
    
            vbox.addStretch(1)
            vbox.addWidget(self.spinBox)
            self.spinBox.valueChanged.connect(self.valuechange)
    
            self.setLayout(vbox)
            self.setGeometry(400, 200, 200, 50)
    
        def valuechange(self):
            self.label.setText("현재 값: " + str(self.spinBox.value()))
    
    
    if __name__ == '__main__':
        app = QApplication(sys.argv)
        window = Spindemo()
        window.show()
        app.exec_()
    
    • 질문 재수정습니다 감사합니다 ㅜㅜ 다크매터 2019.5.19 19:01

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

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

(ಠ_ಠ)
(ಠ‿ಠ)