PyQt 와 데이터 베이스를 이용하여 아래와 같은
과일의 정보를 입력 및 삭제를 할수 있는 인터페이스 생성을 해보자
해당 작업에 들어가기 이전에 가상환경을 통해 필요한 모듈을 설치해 두어야 한다. 가상환경에 설치에 관한 정보는 이전글에서 다루었으니 참고해보면 된다.
위에 인터페이스를 보면 그리드 형태에 인터페이스 창 , 라벨 2개, 입력창 2개,버튼 2개 의 요소가 있는것을 알수 있다.
따라서 필요한 모듈을 입력하면 아래와 같다.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QWidget,\
QGridLayout,QLabel,QLineEdit, QPushButton
from PyQt5.QtCore import QCoreApplication
이제 본문의 내용을 보자
class App(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
# 창에 들어갈 내용
def initUI(self):
# 영역 만들고 레이아웃 설정
widget = QWidget() # 위젯 생성
grid =QGridLayout() # 레이아웃 : 그리드
widget.setLayout(grid) # 위젯에 웨이아웃 설정
#요소 배치 : 라벨 2개, 입력창 2개, 버튼 1개
# 라벨 2개 설정
grid.addWidget(QLabel("과일 :"),0,0)
grid.addWidget(QLabel("계절 :"),1,0)
#입력창 2개 설정
self.in1 = QLineEdit()
self.in2 = QLineEdit()
grid.addWidget(self.in1,0,1)
grid.addWidget(self.in2,1,1)
#버튼 2개
self.btn1 = QPushButton("INSERT")
self.btn2 = QPushButton("DEELET")
#버튼 동작
self.btn1.clicked.connect(self.instert)
self.btn2.clicked.connect(self.delete)
#버튼 위치설정
grid.addWidget(self.btn1, 2,1)
grid.addWidget(self.btn2, 2,0)
#레이아웃 설정된 영역을 메인창에 추가하기
self.setCentralWidget(widget)
# 메인창 규격
self.setWindowTitle('PyQt5 Application')
self.move(600, 400)
self.resize(300, 200)
self.show()
# 입력 버튼
def instert(self):
pass
# 삭제 버튼
def delete(self):
pass
# 앱 동작
if __name__ == '__main__':
#sys.argv = 외부로부터 프로그램에 전달된 인자들
app = QApplication(sys.argv) # 앱 실행
view = App() # 앱 내부 위젯 실행
sys.exit(app.exec_()) # 앱을 종료시키면서 시스템 끄기
#app.exec_() : 앱 내부 실행 관련 코드 반환하기
위와 같이 코드를 작성하게 된다면 앞서 보았던 이미지의 인터페스가 생성될수 있다. 그러나 해당 인터페이스는 빈 깡통과 같은 상태라 아무런 동작을 하지 않는다.
따라서 앞서 말한 동작을위해 database 정보가 필요하다.
우선 database 를 생성해줄 함수가 하나 필요하다.
#데이터 베이스 생성
def initDB(self):
self.con = sql.connect('fruits.db')
self.cur = self.con.cursor()
#테이블이 있다면 기존꺼 사용 없으면 새로 작성
self.cur.execute("CREATE TABLE IF NOT EXISTS fruits(name text, season text)")
self.cur.close()
self.con.close()
해당 함수를 통해 DB를 생성하면 이제 해당 DB에 정보를 입력과 삭제를 해줄 함수가 필요하다. 위에 코드에는 pass로 되어 있는 부분을 살펴보자
<입력>
# 입력 버튼
def instert(self):
# 여기서 Db정보를 다시 불러와야함 (이전에 종료해둬서)
self.con = sql.connect('fruits.db')
self.cur = self.con.cursor()
#LineEdit로 입련된 값을 읽을려면 .text() 필요
input_name = self.in1.text()
input_season = self.in2.text()
self.cur.execute(f"INSERT INTO fruits VALUES ('{input_name}','{input_season}')")
self.con.commit()
self.cur.close()
self.con.close()
해당 부분에서 주석으로 되어있듯 앞서 코드에서 DB를 생성과 동시에 connect와 cursor를 닫았기 때문에 다시 실행과 닫기를 해주어야 오류가 발생하지 않는다.
<삭제>
# 삭제 버튼
def delete(self):
self.con = sql.connect('fruits.db')
self.cur = self.con.cursor()
#LineEdit로 입련된 값을 읽을려면 .text() 필요
delete_name = self.in1.text()
delete_season = self.in2.text()
self.cur.execute(f"DELETE FROM fruits WHERE name ='{delete_name}' AND season = '{delete_season}' ")
self.con.commit()
self.cur.close()
self.con.close()
삭제버튼 또한 위에 입력 버튼과 크게 다르지 않지만
삭제 조건을 동시 만족을 하고싶을떄는 AND를 통해 두 조건을 이어주면 된다.
추가적으로 버튼클릭시 동작에 물어보는 메시지 박스를 추가해 준다면 아래와 같이 코드를 작성 할 수 있다.
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow,QWidget,\
QGridLayout,QLabel,QLineEdit, QPushButton,QMessageBox
from PyQt5.QtCore import QCoreApplication
import sqlite3 as sql
class App(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
self.initDB()
def initDB(self):
self.con = sql.connect('fruits.db')
self.cur = self.con.cursor()
self.cur.execute("CREATE TABLE IF NOT EXISTS fruits(name text, season text)")
self.cur.close()
self.con.close()
def initUI(self):
widget = QWidget()
grid =QGridLayout()
widget.setLayout(grid)
grid.addWidget(QLabel("과일 :"),0,0)
grid.addWidget(QLabel("계절 :"),1,0)
self.in1 = QLineEdit()
self.in2 = QLineEdit()
grid.addWidget(self.in1,0,1)
grid.addWidget(self.in2,1,1)
self.btn1 = QPushButton("INSERT")
self.btn2 = QPushButton("DEELET")
self.btn1.clicked.connect(self.instert)
self.btn1.clicked.connect(self.oninstert)
self.btn2.clicked.connect(self.ondelete)
self.btn2.clicked.connect(self.delete)
grid.addWidget(self.btn1, 2,1)
grid.addWidget(self.btn2, 2,0)
self.setCentralWidget(widget)
self.setWindowTitle('PyQt5 Application')
self.move(600, 400)
self.resize(300, 200)
self.show()
#입력 버튼
def instert(self):
self.con = sql.connect('fruits.db')
self.cur = self.con.cursor()
input_name = self.in1.text()
input_season = self.in2.text()
self.cur.execute(f"INSERT INTO fruits VALUES ('{input_name}','{input_season}')")
self.con.commit()
self.cur.close()
self.con.close()
#삭제 버튼
def delete(self):
self.con = sql.connect('fruits.db')
self.cur = self.con.cursor()
delete_name = self.in1.text()
delete_season = self.in2.text()
self.cur.execute(f"DELETE FROM fruits WHERE name ='{delete_name}' AND season = '{delete_season}' ")
self.con.commit()
self.cur.close()
self.con.close()
# 삽입후 안내 메시지
def oninstert(self):
reply = QMessageBox.question(self, 'Message', '더 입력하시겠습니까?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.No:
QCoreApplication.instance().quit()
else:
pass
# 삭제후 안내 메시지
def ondelete(self):
reply = QMessageBox.question(self, 'Message', '정말 삭제하시겠습니까?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.No:
QCoreApplication.instance().quit()
else:
pass
# 종료 시 메시지
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message', '프로그램을 종료하시겠습니까?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
view = App()
sys.exit(app.exec_())
최종적으로 완성된 DB 파일의 경우 db browser for sqlite 프로그램을 설치하여 확인해보면 결과를 확인할 수 있다.
'파이썬 심화' 카테고리의 다른 글
파이썬 GUI 학습(with PyQt5) (0) | 2024.10.04 |
---|