KG_KAIROS/Python

[KG_KAIROS] 파이썬 강의_6 (Pyqt5)

projectlim 2024. 7. 8. 16:49
728x90
반응형
SMALL

오늘은 24.07.08(월) 비가 오니까 교육장 가는 발걸음이 무겁지만 자취방 문을 박차고 나가봅니다.

월요일....조...좋아...

교육장에 갔더니 강사님도 고달팟다고 하시네요.

 

그래도 할건해야죠....오늘의 강의는 Pyqt!!! 

 

 

그래서 이번에 한 활동은 간단한 창 디자인!!

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

class main(QDialog):  # 상속
    def __init__(self):
        super().__init__()  # Qtdialog의 생성자
        self.init_ui()

    def init_ui(self):
        win = QVBoxLayout()
        self.label_widget1 = QLabel("Hello 1")  # self를 사용하여 클래스 변수로 선언
        self.label_widget2 = QLabel("Hello 2")
        self.btn_widget = QPushButton("Click")
        
        # 버튼 클릭 이벤트 연결
        self.btn_widget.clicked.connect(self.on_click)
        
        win.addWidget(self.label_widget1)
        win.addWidget(self.label_widget2)
        win.addWidget(self.btn_widget)
        
        self.setLayout(win)
        self.setWindowTitle("창 이름")
        self.resize(500, 500)
        self.show()

    def on_click(self):
        # 버튼이 클릭되었을 때 실행될 코드
        self.label_widget1.setText("Button Clicked!")

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

해당 코드를 동작하면!

클릭하면 버튼클릭으로 바뀝니다!!

    def init_ui(self):
        win = QVBoxLayout()
        self.label_widget1 = QLabel("Hello 1")  # self를 사용하여 클래스 변수로 선언
        self.label_widget2 = QLabel("Hello 2")
        self.btn_widget = QPushButton("Click")
        self.spinBox_widget = QSpinBox()
        # 버튼 클릭 이벤트 연결
        self.btn_widget.clicked.connect(self.on_click)
        

        win.addWidget(self.label_widget1)
        win.addWidget(self.label_widget2)
        win.addWidget(self.btn_widget)
        win.addWidget(self.spinBox_widget)
        
        self.spinBox_widget.setMaximum(5)
        self.btn_widget.clicked.connect(self.on_click)
        self.setLayout(win)
        self.setWindowTitle("창 이름")
        self.resize(500, 500)
        self.show()

spinBox를 추가해서 add 해봤습니다.

maximum 5로 설정해서 그 이상 안올라갑니다.

 

>>combo box 위젯 추가!!

       self.comboBox_widget= QComboBox()
        win.addWidget(self.comboBox_widget)
        self.comboBox_widget.addItem("Motor1")
        self.comboBox_widget.addItem("Motor2")
        self.comboBox_widget.addItem("Motor3")\

 

 

뭐 이것저것 추가하면서 놀다가 이젠 라디오 버튼을 클릭하면 화면캡처를 하는 프로그램을 작성해 보겠습니다.

 

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

class main(QDialog):  # 상속
    def __init__(self):
        super().__init__()  # QDialog의 생성자
        self.init_ui()

    def handle_rb(self, ch):
        radio_button = self.sender()
        text = radio_button.text()

        if ch:
            print(f"{text} is selected!")
        else:
            print(f"{text} is deselected!")

    def init_ui(self):
        win = QVBoxLayout()

        self.list_w = QListWidget()  # self.list_w로 변경
        self.item_1 = QListWidgetItem("Dog")
        self.item_2 = QListWidgetItem("Cat")
        self.list_w.addItem(self.item_1)
        self.list_w.addItem(self.item_2)

        self.label_widget1 = QLabel("Hello 1")  # self를 사용하여 클래스 변수로 선언
        self.label_widget2 = QLabel("Hello 2")
        self.btn_widget = QPushButton("Click")
        self.spinBox_widget = QSpinBox()
        self.comboBox_widget = QComboBox()
        # 버튼 클릭 이벤트 연결
        self.btn_widget.clicked.connect(self.on_click)

        self.comboBox_widget.addItem("Motor1")
        self.comboBox_widget.addItem("Motor2")
        self.comboBox_widget.addItem("Motor3")

        self.chechBox_widget1 = QCheckBox("op1")
        self.chechBox_widget2 = QCheckBox("op2")
        self.chechBox_widget1.setChecked(False)
        self.chechBox_widget2.setChecked(False)

        self.radioButton_widget1 = QRadioButton("uga1")  # 텍스트 설정 수정
        self.radioButton_widget2 = QRadioButton("uga2")
        self.radioButton_widget1.toggled.connect(self.handle_rb)
        self.radioButton_widget2.toggled.connect(self.handle_rb)

        win.addWidget(self.label_widget1)
        win.addWidget(self.label_widget2)
        win.addWidget(self.btn_widget)
        win.addWidget(self.spinBox_widget)
        win.addWidget(self.comboBox_widget)
        win.addWidget(self.chechBox_widget1)
        win.addWidget(self.chechBox_widget2)
        win.addWidget(self.radioButton_widget1)
        win.addWidget(self.radioButton_widget2)
        win.addWidget(self.list_w)  # self.list_w로 변경

        self.spinBox_widget.setMaximum(5)
        self.setLayout(win)
        self.setWindowTitle("창 이름")
        self.resize(500, 500)
        self.show()

    def on_click(self):
        # 버튼이 클릭되었을 때 실행될 코드
        self.label_widget1.setText("Button Clicked!")

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

여러 기능들을 사용해본 결과입니다.

 

import cv2
import time
from threading import Thread

def VideoCapture():
    cap = cv2.VideoCapture(0)
    cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
    cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)


    while (cap.isOpened()):  
        ret,img = cap.read()
        img_roi= img[120:240,0:320]
        cv2.imshow('my win',img_roi)
        cv2.imshow('roi',img)
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
    cap.release()

t1=Thread(target=VideoCapture)
t1.daemon=True
t1.start()
cv2.destroyAllWindows()


while True:
    pass

스레드로  캡쳐 프로그램 실습입니다.

 

>>오늘의 최종 미션!

이번시간에 배운 ui radio버튼을 이용해서 저번시간에 배운 실시간 영상을 color와 gray로 나누는 미션을 받았습니다!! 

from camera_class import VideoCapture
import cv2
import sys, os
import PyQt5
from PyQt5 import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
class Main(QDialog) :  #QDialog 클래스 상속
    def __init__(self):    #Main의 생성자
        super().__init__()  #QDialog의 생성자
        self.init_ui()     #init_ui() 호출해서 인터페이스
    def init_ui(self):    #기본 화면 구성
        win = QVBoxLayout()    #vertical box
        self.r1 = QRadioButton()
        self.r2 = QRadioButton()
        
        self.r1.setText('color')
        self.r2.setText('gray')


        self.r1.toggled.connect(self.set_color)
        self.r2.toggled.connect(self.set_gray)

        win.addWidget(self.r1)
        win.addWidget(self.r2)
        self.setLayout(win)    #레이아웃 설정
        self.setWindowTitle("창 이름")    #창 이름 설정
        self.resize(500,500)    #화면 크기 조정
        self.show()    #화면 열기
    def set_color(self):
        vc.set_color()
    def set_gray(self):
        vc.set_gray()
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = Main()    #Main 클래스의 인스턴스를 생성하고 main 변수에 할당해서 열린 창 유지.
    vc = VideoCapture()
    vc.start()
    sys.exit(app.exec_())

위 코드는 레이아웃 코딩

 

import cv2
import time
from threading import Thread

class VideoCapture(Thread):

    def __init__(self):
        Thread.__init__(self)
        self.cap = cv2.VideoCapture(0)
        self.cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
        self.cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)
        self.color = 0

    def set_color(self):
        self.color=0
    def set_gray(self):
        self.color=1

    def run(self):
        while (self.cap.isOpened()):  
            ret,img = self.cap.read()
            img_roi= img[120:240,0:320]
            if self.color == 0:
                cv2.imshow('my win',img)
                cv2.imshow('roi',img_roi)
            else:
                img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
                cv2.imshow('my win',img_gray)
                cv2.imshow('roi',img_roi)
            if cv2.waitKey(1) & 0xFF == ord('q'):
                break
        self.cap.release()

if __name__ == '__main__':
    vc=VideoCapture()
    vc.start()
    cv2.destroyAllWindows()

위 코드가 opencv활용 코드

 

color 췍~!, gray 췍~!

 

728x90
반응형
LIST