개발자 특성상 웹디자인에 약한 편입니다. 별생각 없이 기능만 구현하였는데 주식 자동매매 프로그램 사용자께서 GUI 우측 정렬 및 천 단위 구분 콤마 설정 요청이 오셨고 저도 필요하다고 판단되어 아래와 같이 특강을 실시합니다.
[유튜브 강의, 링크]와 같이 보시면 많은 도움이 되실 겁니다.
1. 기존의 GUI와 개선되는 부분 요약
(1) Label의 천 단위 구분 콤마가 고려되어 있지 않습니다.
(2) QTableWidget
A. 셀 입력값의 천단위 구분 콤마가 고려되어 있지 않습니다.
B. 좌측 정렬을 우측 정렬로 바꿀 필요가 있습니다.(대한민국의 모든 공문서의 표는 우측 정렬입니다.)
C. 셀 크기가 입력값에 맞춰지지 않고 고정되어 있습니다.
(3) TextEdit
A. 좌측 정렬을 우측 정렬로 바꿀 필요가 있습니다.
B. 특정 숫자 입력 구간을 Double Spin Box로 교체 후 천 단위 구분 콤마가 필요합니다.
C. Double Spin Box값을 buy_last라는 QTableWidget에서 읽어 드릴 수 있도록 수정합니다.
- 기존에는 TextEdit을 값을 읽어 들였다면 수정 후에는 Double Spin Box값을 읽어 들여야 되어 함수가 약간 다릅니다.
2. 기존의 GUI 개선
(1) Label 천단위 구분 콤마 생성, QThread_1에 들어갈 내용입니다.
Thread1에서 작성한 Label 값을 아래와 같이 수정합니다.
- 기존 : 입력값
- 변경 : format(입력값, ",")
아래를 확인하시면
- 기존 : self.parent.label_1.setText(str(totalBuyingPrice))를
- 변경 : self.parent.label_1.setText(str(format(totalBuyingPrice, ",")))로 변경하였습니다.
수정 후 결과는 아래와 같습니다.
self.parent.label_1.setText(str(format(totalBuyingPrice, ",")))
self.parent.label_2.setText(str(format(currentTotalPrice, ",")))
self.parent.label_3.setText(str(format(balanceAsset, ",")))
self.parent.label_4.setText(str(format(totalEstimateProfit, ",")))
self.parent.label_5.setText(str(format(total_profit_loss_rate, ",")))
(2) QTableWidget, QThread_1에 들어갈 내용입니다.
A. 셀 입력값의 천 단위 구분 콤마가 고려
- 기존 : 입력값
- 변경 : format(입력값, ",")
아래를 확인하시면
- 기존 : self.parent.stocklistTableWidget_2.setItem(index, 2, QTableWidgetItem(str(amount)))를
- 변경 : self.parent.stocklistTableWidget_2.setItem(index, 2, QTableWidgetItem(str(format(amount, ","))))로 변경하였습니다.
수정 후 결과는 아래와 같습니다.
self.parent.stocklistTableWidget_2.setItem(index, 0, QTableWidgetItem(str(itemCode)))
self.parent.stocklistTableWidget_2.setItem(index, 1, QTableWidgetItem(str(itemName)))
# 천단위 구분 콤마 사용
self.parent.stocklistTableWidget_2.setItem(index, 2, QTableWidgetItem(str(format(amount, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 3, QTableWidgetItem(str(format(buyingPrice, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 4, QTableWidgetItem(str(format(currentPrice, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 5, QTableWidgetItem(str(format(estimateProfit, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 6, QTableWidgetItem(str(format(profitRate, ","))))
B. 좌측 정렬을 우측 정렬로 변경
- 원하는 행과 열에 setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)를 붙여 넣기
- self.parent.stocklistTableWidget_2.item(index, 0).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
- stocklistTableWidget_2 테이블 위젯의 index행, 0 열을 우측 정렬, 수직 가운데 정렬로 바꿨습니다.
수정 후 결과는 아래와 같습니다.
############# 좌측 정렬을 우측 정렬로 교체
self.parent.stocklistTableWidget_2.item(index, 0).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 1).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 2).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 3).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 4).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 5).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 6).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
C. 셀 크기가 입력값에 맞춰 변경
- 이 부분은 아주 간단합니다. 원하는 테이블 위젯에 resize 함수를 사용하는 것입니다.
- 행 : resizeRowsToContents()
- 열 : resizeColumnsToContents()
self.parent.stocklistTableWidget_2.resizeColumnsToContents()
self.parent.stocklistTableWidget_2.resizeRowsToContents()
위의 내용은 QThread_1에 들어갈 내용이며, Labe 및 QTableWidget의 모든 내용을 수정 완료했습니다.
(2) TextEdit, Main 스크립트에 들어갈 내용입니다.
A. 좌측 정렬을 우측 정렬로 변경
변경을 원하는 TextEdit 옆에 setAlignment(Qt.AlignRight)를 입력합니다. 우리가 우측 정렬할 TextEdit은 종목 이름 입력 구간뿐입니다.
self.searchItemTextEdit2.setAlignment(Qt.AlignRight)
B. 특정 숫자 입력 구간을 Double Spin Box로 교체 후 천 단위 구분 콤마로 변경
매수 가격/매수 수량/익절 가격/손절 가격을 TextEdit에서 spinbox로 전부 교체합니다. 사용자 편의를 위해서 그렇습니다.
아래 그림과 같이 Double Spin Box를 구현합니다. 총 4개가 필요하며, objectName은 기존의 TextEdit과 동일하게 합니다.
- 천 단위 구분 콤마 적용 : 아래 showGroupSeparator를 체크하십시오. 그리고 추가로 스핀 박스에 입력할 수 있는 최대 값을 1억 정도로 수정하세요. 우리나라 주식이 아무리 비싸 봐야 1천만 원을 넘지 못하지만 혹시 몰라 마진을 두고 입력하였습니다. 나머지도 다 동일합니다.
- 더블 스핀 박스 우측 정렬 및 소수점 제거 : 우측 정렬은 원하는 더블 스핀 박스 옆에 setAlignment(Qt.AlignRight)를 사용합니다. 그리고 소수점 제거를 위해 setDecimals(0)을 넣으십시오. 0이 아닌 1을 넣으면, 소수점 1개가 됩니다.
self.buy_price.setAlignment(Qt.AlignRight)
self.buy_price.setDecimals(0)
self.n_o_stock.setAlignment(Qt.AlignRight)
self.n_o_stock.setDecimals(0)
self.profit_price.setAlignment(Qt.AlignRight)
self.profit_price.setDecimals(0)
self.loss_price.setAlignment(Qt.AlignRight)
self.loss_price.setDecimals(0)
최종 결과는 아래와 같습니다. 정확한 값이 우측 정렬 및 소수점 구분으로 보이는 것을 확인할 수 있습니다.
C. Double Spin Box값을 buy_last라는 QTableWidget에서 읽어 들이기
- 기존 : TextEdit.toPlainText()
- 변경 : DoubleSpinBox.value()
- 아래 buy_last 테이블 이젯에서 각 행과 열에 입력되는 값은 toPlainText()에서 value()로 변경되었습니다.
- buy_last 테이블 위젯의 결과입니다. 매수 가격/매수 수량/익절 가격/손절 가격을 정확히 읽어 들이는 것을 확인할 수 ㅣ있습니다.
self.buylast.setItem(row_count, 0, QTableWidgetItem(str(self.new_code))) # 실제 입력값은 1행부터이나 0부터 들어가야 된다.
self.buylast.setItem(row_count, 1, QTableWidgetItem(str(itemName)))
################## 더블 스핀 박스 내용 읽기
self.buylast.setItem(row_count, 4, QTableWidgetItem(str(self.buy_price.value())))
self.buylast.setItem(row_count, 5, QTableWidgetItem(str(self.n_o_stock.value())))
self.buylast.setItem(row_count, 6, QTableWidgetItem(str(self.profit_price.value())))
self.buylast.setItem(row_count, 7, QTableWidgetItem(str(self.loss_price.value())))
3. 요약
- Label의 천 단위 구분
self.parent.label_1.setText(str(format(totalBuyingPrice, ",")))
self.parent.label_2.setText(str(format(currentTotalPrice, ",")))
self.parent.label_3.setText(str(format(balanceAsset, ",")))
self.parent.label_4.setText(str(format(totalEstimateProfit, ",")))
self.parent.label_5.setText(str(format(total_profit_loss_rate, ",")))
- QTableWidget의 천단위 콤마 구분/ 우측 정렬/입력 값에 셀 크기 맞추기
self.parent.stocklistTableWidget_2.setItem(index, 0, QTableWidgetItem(str(itemCode)))
self.parent.stocklistTableWidget_2.setItem(index, 1, QTableWidgetItem(str(itemName)))
# 천단위 구분 콤마 사용
self.parent.stocklistTableWidget_2.setItem(index, 2, QTableWidgetItem(str(format(amount, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 3, QTableWidgetItem(str(format(buyingPrice, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 4, QTableWidgetItem(str(format(currentPrice, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 5, QTableWidgetItem(str(format(estimateProfit, ","))))
self.parent.stocklistTableWidget_2.setItem(index, 6, QTableWidgetItem(str(format(profitRate, ","))))
############# 좌측 정렬을 우측 정렬로 교체
self.parent.stocklistTableWidget_2.item(index, 0).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 1).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 2).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 3).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 4).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 5).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.item(index, 6).setTextAlignment(Qt.AlignVCenter | Qt.AlignRight)
self.parent.stocklistTableWidget_2.resizeColumnsToContents()
self.parent.stocklistTableWidget_2.resizeRowsToContents()
- TextEdit의 우측 정렬
self.searchItemTextEdit2.setAlignment(Qt.AlignRight)
- Double Spin Box의 우측 정렬, 천단위 콤마 구분, 소수점 제거
self.buy_price.setAlignment(Qt.AlignRight)
self.buy_price.setDecimals(0)
self.n_o_stock.setAlignment(Qt.AlignRight)
self.n_o_stock.setDecimals(0)
self.profit_price.setAlignment(Qt.AlignRight)
self.profit_price.setDecimals(0)
self.loss_price.setAlignment(Qt.AlignRight)
self.loss_price.setDecimals(0)
- Double Spin Box값 읽어 들이기
self.buylast.setItem(row_count, 0, QTableWidgetItem(str(self.new_code))) # 실제 입력값은 1행부터이나 0부터 들어가야 된다.
self.buylast.setItem(row_count, 1, QTableWidgetItem(str(itemName)))
################## 더블 스핀 박스 내용 읽기
self.buylast.setItem(row_count, 4, QTableWidgetItem(str(self.buy_price.value())))
self.buylast.setItem(row_count, 5, QTableWidgetItem(str(self.n_o_stock.value())))
self.buylast.setItem(row_count, 6, QTableWidgetItem(str(self.profit_price.value())))
self.buylast.setItem(row_count, 7, QTableWidgetItem(str(self.loss_price.value())))
'주식 자동매매 강의 > 기초반(모든 코딩의 뿌리)' 카테고리의 다른 글
주식자동매매 42강. 실시간 자동매매 구현(4), KOA Studio 실시간 데이터 가져오기 개념 설명 (2) | 2022.06.09 |
---|---|
주식자동매매 41강. 실시간 자동매매 구현(3), 자동 매매 시작 GUI(Push Button) 및 스레드 스크립트 생성 (9) | 2022.06.07 |
주식자동매매 40강. 실시간 자동매매 구현(2), 매수/매도 관련 내용 QTable Widget에 입력하기 (8) | 2022.06.02 |
주식자동매매 39강. 실시간 자동매매 구현(1), KOA Studio등 실시간 매매 개념 잡기,GUI 구성하기 (5) | 2022.06.01 |
주식자동매매 38강. 선정 종목 데이터베이스화 하기(3), 저장된 텍스트 파일 삭제 및 코드 공개 (0) | 2022.05.31 |