1. IoT 디바이스 설정
2. IoT 데이ㅣ터 저장 서비스 구성
3. 모니터링 및 관리 시스템 개발
[√] 팀 깃허브 만들기
[√] 팀 노션 만들기
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('<','<').replace('>','>').replace('<b>','').replace('</b>','').replace(''',"'").replace('"','"')
# 변환 안 된 특수문자가 나타나면 밑에 추가
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으로 리턴