코딩/pyqt, pyside

[pyqt5] 야구 중계에 스트라이크 존이 제공되지 않을 때 시청자를 위한 가이드 앱

비스카이비전 2022. 3. 16. 20:39

야구 중계를 보면 보통 시청자들에게 스트라이크 존에 대한 정보를 주기 위해 사각형 가이드가 함께 송출됩니다. 그런데 간혹 어떤 중계에서는 그러한 가이드가 없는 경우가 있습니다. 이런 경우에는 시청의 재미가 반갑됩니다.

 

저는 이런 경우를 위해서 pyqt를 이용하여 간단한 프로그램을 만들어봤습니다(예전에 심심풀이로 만들어봤는데, 이제야 공유해봅니다). 우선 설치 필요한 패키지는 pyqt5와 pyinstaller입니다.

 

pip install pyqt5

pip install pyinstaller

 

 

파이썬 소스코드는 다음과 같습니다.

 

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QSlider, QDialog, QPushButton, QHBoxLayout, QVBoxLayout
from PyQt5.QtGui import QPainter, QPen, QColor, QBrush, QIcon, QPixmap
from PyQt5.QtCore import QCoreApplication, Qt, QPoint
import icon

class MyApp(QWidget):

    def __init__(self):
        super().__init__()
        self.stzw = 200
        self.stzh = 200
        self.initUI()

    def changeStzW(self):
        self.stzw = self.slider1.value()
        print(self.stzw)
        self.resize(self.stzw, self.stzh)

    def changeStzH(self):
        self.stzh = self.slider2.value()
        print(self.stzh)
        self.resize(self.stzw, self.stzh)

    def initUI(self):
        self.slider1 = QSlider(Qt.Horizontal, self)
        self.slider1.setRange(100, 500)
        self.slider1.setValue(200)
        self.slider1.setSingleStep(2)

        self.slider2 = QSlider(Qt.Vertical, self)
        self.slider2.setRange(100, 500)
        self.slider2.setInvertedAppearance(True)
        self.slider2.setValue(200)
        self.slider2.setSingleStep(2)

        self.slider1.valueChanged.connect(self.changeStzW)
        self.slider2.valueChanged.connect(self.changeStzH)

        self.button = QPushButton('close', self)
        self.button.clicked.connect(QCoreApplication.instance().quit)
        self.button.move(30, 30)
        self.button.setStyleSheet("background-color: rgba(0, 0, 0, 0.1); color: white; font-weight: bold;")
        self.button.resize(60, 30)
        
        self.setWindowTitle('STZONE v1.0')
        self.setWindowIcon(QIcon(':/icon.png'))
        self.setWindowFlags(Qt.FramelessWindowHint | Qt.WindowStaysOnTopHint)
        self.setAttribute(Qt.WA_TranslucentBackground, True)
        self.move(300, 300)
        self.resize(self.stzw, self.stzh)
        self.show()

    def mousePressEvent(self, event):
        self.oldPos = event.globalPos()

    def mouseMoveEvent(self, event):
        delta = QPoint(event.globalPos() - self.oldPos)
        self.move(self.x() + delta.x(), self.y() + delta.y())
        self.oldPos = event.globalPos()

    def paintEvent(self, e):
        qp = QPainter()
        qp.begin(self)
        self.draw_rect(qp)
        qp.end()

    def draw_rect(self, qp):
        qp.setBrush(QColor(0, 0, 0, 0))
        qp.setPen(QPen(QColor(255, 0, 0), 5))
        qp.drawRect(int(self.width()/3), int(self.height()/3), int(self.width()/3), int(self.height()/3))

        qp.setPen(QPen(Qt.red, 2))
        qp.drawLine(int(self.width()/3), int(4*self.height()/9), int(2 * self.width()/3), int(4*self.height()/9))

        qp.setPen(QPen(Qt.red, 2))
        qp.drawLine(int(self.width()/3), int(5*self.height()/9), int(2 * self.width()/3), int(5*self.height()/9))

        qp.setPen(QPen(Qt.red, 2))
        qp.drawLine(int(4*self.width()/9), int(self.height()/3), int(4 * self.width()/9), int(2*self.height()/3))

        qp.setPen(QPen(Qt.red, 2))
        qp.drawLine(int(5*self.width()/9), int(self.height()/3), int(5 * self.width()/9), int(2*self.height()/3))


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

 

그리고 pyinstaller를 이용해서 빌드할 때 사용한 명령어는 다음과 같습니다. 

 

pyinstaller --onefile --noconsole --icon=icon.ico --add-data="icon.ico;." -n="STZone v1.0" stzone.py

 

릴리즈된 프로그램을 다운로드받고 싶으신 분들은 https://github.com/kyohoonsim/stzone에서 우측 Releases에서 STZone v1.0을 클릭하신 후 STZone.v1.0.exe를 클릭하시면 됩니다.

 

 

사용법은 아이콘을 더블클릭하여 프로그램을 실행한 후에 중계 화면 위에 올려놓고 적절하게 사이즈 조정하면 됩니다. 

 

 

간단한 프로그램이지만 심판이 제대로 스트라이크 판정을 하고 있는지 살펴볼 때 도움이 되더라고요. 이 프로그램이 마음에 드신 분들은 제 깃헙에 별 하나 남겨주세요^^


1 2 3 4 5 6 7