IoT 개발 프로젝트

sz L·2023년 3월 7일
0

MINII_Project

목록 보기
1/15
post-thumbnail

1. IoT 디바이스 설정

2. IoT 데이ㅣ터 저장 서비스 구성

3. 모니터링 및 관리 시스템 개발

[√] 팀 깃허브 만들기
[√] 팀 노션 만들기


PyQt5사용하기

python파일으로 만들기

# PyQt 복습 - 직접 디자인 코딩
import sys
from PyQt5.QtWidgets import *
class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.lblMessages = QLabel('메시지: ',self)
        self.lblMessages.setGeometry(10,5,300,50)

        btnOK = QPushButton('OK',self)
        btnOK.setGeometry(280,250,100,40)
        # PyQt event(signal) -> 이벤트핸들러(슬롯)
        btnOK.clicked.connect(self.btnOK_clicked)
        
        self.setGeometry(300,200,400,300)
        self.setWindowTitle('복습PyQt')
        self.show()        

    def btnOK_clicked(self):
        self.lblMessages.clear()
        self.lblMessages.setText('메시지: OK')

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    sys.exit(app.exec_())

Qt Designer 사용
경로 : C:\DEV\Langs\Python311\Lib\site-packages\QtDesigner

# QtDesigner 디자인 사용
import sys
from PyQt5 import QtGui,QtWidgets,uic
from PyQt5.QtWidgets import *

class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/mainApp.ui',self)

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())


# QtDesigner 디자인 사용
import sys
from PyQt5 import QtGui,QtWidgets,uic
from PyQt5.QtWidgets import *

class qtApp(QWidget):
    count = 0 # 클릭횟수

    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/mainApp.ui',self)
        
        # QtDesigner 에서 구성한 위젯 시그널 만듬
        self.btnOK.clicked.connect(self.btnOKClicked)
        self.btnPOP.clicked.connect(self.btnPOPClicked)

    def btnPOPClicked(self):
        QMessageBox.about(self,'popup','까꿍')
        
    def btnOKClicked(self): # 슬롯함수 
        self.count += 1
        self.lblMessage.clear()
        self.lblMessage.setText(f'메시지: OK + {self.count}') 


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())




네이버 개발자 센터
application 만들기 : http://localhost

import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *

class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/NaverAPISearch.ui',self)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())


#NaverSearchApp.py
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
from NaverAPI import *

class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/NaverAPISearch.ui',self)
      
        # 검색 버튼 클릭시그널 / 슬롯함수
        self.btnSearch.clicked.connect(self.btnSearchClicked)
        # 검색어 입력 후 엔터를 치면 처리
        self.txtSearch.returnPressed.connect(self.txtSearchReturned)

    def txtSearchReturned(self):
        self.btnSearchClicked()

    def btnSearchClicked(self):
        search = self.txtSearch.text()

        if search == '':
            QMessageBox.warning(self,'경고','검색어를 입력하세요.')
            return
        else:
            api = NaverAPI() # Naver API 클래스 객체 생성
            node = 'news' # movie로 변경하면 영화검색 가능
            display = 100
            output = [] # 결과 담을 리스트 변수

            result = api.get_naver_search(node,search,1,display)
            # print(result)
            # 테이블 위젯에 출력하는 기능
            items = result['items'] # json 결과 중 items 아래 배열만 추출
            self.makeTable(items) # 테이블 위젯에 데이터들을 할당하는 함수

    # 테이블 위젯에 데이터 display
    def makeTable(self,items) -> None:
        self.tblresult.setSelectionMode(QAbstractItemView.SingleSelection)
        self.tblresult.setColumnCount(2)
        self.tblresult.setRowCount(len(items)) # 현재 items 개수의 행 생성 : 100개
        self.tblresult.setHorizontalHeaderLabels(['기사제목','뉴스링크'])
        self.tblresult.setColumnWidth(0,310)
        self.tblresult.setColumnWidth(1,260)
        # 컬럼 데이터 수정 금지
        self.tblresult.setEditTriggers(QAbstractItemView.NoEditTriggers)

        for i, post in enumerate(items): # 0, 뉴스 ...
            title = post['title']
            originallink = post['originallink']
            # setItem(행,열,넣을 데이터)
            self.tblresult.setItem(i,0,QTableWidgetItem(title))
            self.tblresult.setItem(i,1,QTableWidgetItem(originallink))

if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())
#NaverAPI.py
# NaverAPI class- openAPI : 인터넷을 통해 데이터를 전달 받음
from urllib.request import Request, urlopen
from urllib.parse import quote
import datetime # 현재시간 사용
import json # 결과는 json으로 return
class NaverAPI:
    # 생성자
    def __init__(self) -> None:
        print('Naver API 생성')

    # Naver API를 요청하는 함수
    def get_request_url(self,url):
        req = Request(url)
        # Naver API 개인별 인증
        req.add_header('X-Naver-Client-Id','VAWxYc3u4xYAh_Tw4roC') # naver application 클라이언트 아이디 : 내꺼
        req.add_header('X-Naver-Client-Secret','GVdU6AhnmY') # naver application 클라이언트 비번 : 내꺼

        try:
            res = urlopen(req) # 요청 결과가 바로 돌아온다
            if res.getcode() == 200: # response OK
                print(f'[{datetime.datetime.now()}] Naver API 요청 성공')
                return res.read().decode('utf-8')
            else:
                print(f'[{datetime.datetime.now()}] Naver API 요청 실패')
                return None
        except Exception as e:
            print(f'[{datetime.datetime.now()}] 예외발생 {e}')
            return None
      
    # 실제 호출함수
    def get_naver_search(self,node,search,start,display):
        base_url = 'https://openapi.naver.com/v1/search'
        node_url = f'/{node}.json'
        params = f'?query={quote(search)}&start={start}&display={display}'

        url = base_url + node_url + params
        retData = self.get_request_url(url)

        if retData == None:
            return None
        else:
            return json.loads(retData)  # json으로 리턴

    # json으로 받은 데이터를 list로 바꿔준다
    def get_post_data(self,post,output):
        title = post['title']
        description = post['description']
        orginallink = post['orginallink']
        link = post['link']

        # 'pubDate': 'Tue, 07 Mar 2023 17:04:00 +0900' 문자열로 들어온 데이터를 날짜형으로 변환해준다
        pubDate = datetime.datetime.strptime(post['pubDate'], '%a, %d %b %Y %H:%M:%S +0900')
        # 2023-03-07 17:04:00변경
        pubDate = pubDate.strftime('%Y-%m-%d %H:%M:%S')
        # output에 옮기기 (리스트에 딕셔너리로 값 넣기)
        output.append({'title':title,
                       'description':description,
                       'originallink':originallink,
                       'link':link,
                       'pubDate':pubDate}) 


최종


# NaverSearchApp.py
import sys
from PyQt5 import uic
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from NaverAPI import *
import webbrowser # 웹브라우저 모듈

class qtApp(QWidget):
    def __init__(self):
        super().__init__()
        uic.loadUi('./studyPyQt/NaverAPISearch.ui',self)
        self.setWindowIcon(QIcon('./studyPyQt/newsPaper.png'))
        
        # 검색 버튼 클릭시그널 / 슬롯함수
        self.btnSearch.clicked.connect(self.btnSearchClicked)
        # 검색어 입력 후 엔터를 치면 처리
        self.txtSearch.returnPressed.connect(self.txtSearchReturned)
        self.tblresult.doubleClicked.connect(self.tblresultDoubleClicked)

    def tblresultDoubleClicked(self):
        # row = self.tblresult.currentIndex().row()
        # column = self.tblresult.currentIndex().column()
        # print(row,column)
        selected = self.tblresult.currentRow()
        url = self.tblresult.item(selected,1).text() # 더블 클릭하면 url
        # print(url) # 콘솔창에  프린트
        webbrowser.open(url) # 웹브라우저 창에 링크가 뜬다


    def txtSearchReturned(self):
        self.btnSearchClicked()

    def btnSearchClicked(self):
        search = self.txtSearch.text()

        if search == '':
            QMessageBox.warning(self,'경고','검색어를 입력하세요.')
            return
        else:
            api = NaverAPI() # Naver API 클래스 객체 생성
            node = 'news' # movie로 변경하면 영화검색 가능
            display = 100

            result = api.get_naver_search(node,search,1,display)
            # print(result)
            # 테이블 위젯에 출력하는 기능
            items = result['items'] # json 결과 중 items 아래 배열만 추출
            self.makeTable(items) # 테이블 위젯에 데이터들을 할당하는 함수

    # 테이블 위젯에 데이터 display
    def makeTable(self,items) -> None:
        self.tblresult.setSelectionMode(QAbstractItemView.SingleSelection)
        self.tblresult.setColumnCount(2)
        self.tblresult.setRowCount(len(items)) # 현재 items 개수의 행 생성 : 100개
        self.tblresult.setHorizontalHeaderLabels(['기사제목','뉴스링크'])
        self.tblresult.setColumnWidth(0,310)
        self.tblresult.setColumnWidth(1,260)
        # 컬럼 데이터 수정 금지
        self.tblresult.setEditTriggers(QAbstractItemView.NoEditTriggers)

        for i, post in enumerate(items): # 0, 뉴스 ...
            title = self.replaceHtmlTag(post['title']) # HTML 특수문자 변환
            originallink = post['originallink']
            # setItem(행,열,넣을 데이터)
            self.tblresult.setItem(i,0,QTableWidgetItem(title))
            self.tblresult.setItem(i,1,QTableWidgetItem(originallink))
        
    def replaceHtmlTag(self,sentence) -> str:
        result = sentence.replace('&lt','<').replace('&gt','>').replace('<b>','').replace('</b>','').replace('&apos;',"'").replace('&quot;','"')  
        # 변환 안 된 특수문자가 나타나면 밑에 추가

        return result


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = qtApp() # MyApp(9일차 참고)
    ex.show()
    sys.exit(app.exec_())
# NaverAPI.py
# NaverAPI class- openAPI : 인터넷을 통해 데이터를 전달 받음
from urllib.request import Request, urlopen
from urllib.parse import quote
import datetime # 현재시간 사용
import json # 결과는 json으로 return
class NaverAPI:
    # 생성자
    def __init__(self) -> None:
        print(f'[{datetime.datetime.now()}] Naver API 생성')

    # Naver API를 요청하는 함수
    def get_request_url(self,url):
        req = Request(url)
        # Naver API 개인별 인증
        req.add_header('X-Naver-Client-Id','VAWxYc3u4xYAh_Tw4roC') # naver application 클라이언트 아이디 : 내꺼
        req.add_header('X-Naver-Client-Secret','GVdU6AhnmY') # naver application 클라이언트 비번 : 내꺼

        try:
            res = urlopen(req) # 요청 결과가 바로 돌아온다
            if res.getcode() == 200: # response OK
                print(f'[{datetime.datetime.now()}] Naver API 요청 성공')
                return res.read().decode('utf-8')
            else:
                print(f'[{datetime.datetime.now()}] Naver API 요청 실패')
                return None
        except Exception as e:
            print(f'[{datetime.datetime.now()}] 예외발생 {e}')
            return None
        
    # 실제 호출함수
    def get_naver_search(self,node,search,start,display):
        base_url = 'https://openapi.naver.com/v1/search'
        node_url = f'/{node}.json'
        params = f'?query={quote(search)}&start={start}&display={display}'

        url = base_url + node_url + params
        retData = self.get_request_url(url)

        if retData == None:
            return None
        else:
            return json.loads(retData)  # json으로 리턴
profile
가랑비는 맞는다 하지만 폭풍은 내 것이야

0개의 댓글

관련 채용 정보