컴퓨터/mysql

pyqt5 19강~21강_mysql_curd 리턴제로님 강의정리

풍경소리^^ 2020. 2. 24. 05:08

import sys, pymysql
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, \
QLineEdit, QPushButton, QTreeView, QMessageBox
from PyQt5.QtGui import QStandardItemModel
from PyQt5.QtCore import Qt


class insert(QWidget):
global w

def __init__(self):
super().__init__()
self.initUI()

def initUI(self):
self.setGeometry(500, 330, 250, 180)
self.setWindowTitle("데이터 추가")

self.lbl번호 = QLabel("번호", self)
self.lbl번호.move(25, 25)
self.txt번호 = QLineEdit(self)
self.txt번호.move(25 + 49, 22)
self.txt번호.setReadOnly(True) # 루프 돌면서 지정할 거니까 변경하지 못하도록 ReadOnly 속성 지정
self.lbl이름 = QLabel("이름", self)
self.lbl이름.move(25, 60)
self.txt이름 = QLineEdit(self)
self.txt이름.move(25 + 49, 57)
self.lbl주소 = QLabel("주소", self)
self.lbl주소.move(25, 95)
self.txt주소 = QLineEdit(self)
self.txt주소.move(25 + 49, 92)

self.btn입력 = QPushButton("입력", self)
self.btn입력.move(85, 130)
self.btn입력.clicked.connect(self.into)

def into(self):
if(self.txt이름.text() != "") and (self.txt주소.text() != ""):
try:
self.cmd = "insert into test2(`no`, `name`, `addr`) values({},'{}','{}')" \
.format(self.txt번호.text(), self.txt이름.text(), self.txt주소.text())
print(self.cmd)
w.cur.execute(self.cmd)
w.conn.commit()
# w.리스트.setCurrentIndex(self.txt번호.text()-1, 0)
w.txt번호.setText(self.txt번호.text())
w.txt이름.setText(self.txt이름.text())
w.txt주소.setText(self.txt주소.text())

except:
QMessageBox.information(self, "삽입 오류", "올바른 형식으로 입력하세요.",
QMessageBox.Yes, QMessageBox.Yes)
return
else:
QMessageBox.information(self, "입력 오류", "빈칸 없이 입력하세요.",
QMessageBox.Yes, QMessageBox.Yes)
return
self.close()

def showEvent(self, QShowEvent):
self.txt번호.setText(str(w.cnt[0] + 1))
self.txt이름.clear()
self.txt주소.clear()

class sql(QWidget):
cnt = 0
global k
# list = []

def __init__(self):
super().__init__() # 상위객체생성
self.sqlConnect()
self.initUI() # 클래스 안의 메소드 호출
# self.run()

def sqlConnect(self):
try:
self.conn = pymysql.connect(
host="192.168.1.65",
user="유저아이디",
password="패스워드",
db="디비아이디",
port=3306,
charset="utf8"
)
except:
print("문제가 있네요!")
exit(1)
print("연결 성공!")
self.cur = self.conn.cursor()

def initUI(self):
self.w = 400
self.h = 420
self.btnSize = 40
self.setGeometry(300, 300, self.w, self.h)
self.setWindowTitle("데이터 베이스 활용 예제")

self.lbl번호 = QLabel("번호", self)
self.lbl번호.move(25, 25)
self.txt번호 = QLineEdit(self)
self.txt번호.move(25 + 49, 22)
self.txt번호.setReadOnly(True) # 루프 돌면서 지정할 거니까 변경하지 못하도록 ReadOnly 속성 지정
self.lbl이름 = QLabel("이름", self)
self.lbl이름.move(25, 60)
self.txt이름 = QLineEdit(self)
self.txt이름.move(25 + 49, 57)
self.lbl주소 = QLabel("주소", self)
self.lbl주소.move(25, 95)
self.txt주소 = QLineEdit(self)
self.txt주소.move(25 + 49, 92)

self.리스트 = QTreeView(self)
self.리스트.setRootIsDecorated(False)
# self.리스트.setRootIsDecorated(True)
self.리스트.setAlternatingRowColors(True)
self.리스트.resize(330, 200)
self.리스트.move(25, 130)

self.내용 = QStandardItemModel(0, 3, self)
self.내용.setHeaderData(0, Qt.Horizontal, "번호")
self.내용.setHeaderData(1, Qt.Horizontal, "이름")
self.내용.setHeaderData(2, Qt.Horizontal, "주소")
self.리스트.clicked.connect(self.slt) # slt 클릭 이벤트 연결

self.리스트.setModel(self.내용)
self.리스트.setColumnWidth(0, 40)
self.리스트.setColumnWidth(1, 80)

self.cmd이전 = QPushButton("이전", self)
self.cmd이전.resize(self.btnSize, self.btnSize)
self.cmd이전.clicked.connect(self.pre) # pre 연결
self.cmd다음 = QPushButton("다음", self)
self.cmd다음.resize(self.btnSize, self.btnSize)
self.cmd다음.clicked.connect(self.next) # next 연결
self.cmd신규 = QPushButton("신규", self)
self.cmd신규.clicked.connect(self.new) # new 연결
self.cmd신규.resize(self.btnSize, self.btnSize)
self.cmd수정 = QPushButton("수정", self)
self.cmd수정.resize(self.btnSize, self.btnSize)
self.cmd수정.clicked.connect(self.edit) # edit 연결
self.cmd삭제 = QPushButton("삭제", self)
self.cmd삭제.resize(self.btnSize, self.btnSize)
self.cmd삭제.clicked.connect(self.dlt) # dlt 연결

# self.txt번호.clear()
# self.txt이름.clear()
# self.txt주소.clear()

# self.cur.execute("select max(no) from test2")
# self.conn.commit()
# self.cnt = self.cur.fetchone()[0]

self.show()

def dlt(self):
a = QMessageBox.question(self, "삭제 확인", "정말로 삭제 하시겠습니까?",
QMessageBox.Yes|QMessageBox.No, QMessageBox.No)
if a == QMessageBox.Yes:
self.cmd = "delete from test2 where `no` = {}".format(self.txt번호.text())
print(self.cmd)
self.cur.execute(self.cmd)
self.conn.commit()
# self.cnt = self.cnt - 1
# self.내용.removeRow(self.cnt)
# self.pre()
self.slt()


def pre(self):
if self.리스트.currentIndex().row() == 0:
return
else:
self.리스트.setCurrentIndex(self.내용.index(self.리스트.currentIndex().row() - 1, 0))
self.slt()

def next(self):
if self.리스트.currentIndex().row() == self.cnt - 1:
return
else:
self.리스트.setCurrentIndex(self.내용.index(self.리스트.currentIndex().row() + 1, 0))
self.slt()

def edit(self):
if (self.txt이름.text() != "") and (self.txt주소.text() != ""):
try:
self.cmd = "update test2 set `name` = '{}', `addr` = '{}' where `no` = {}" \
.format(self.txt이름.text(), self.txt주소.text(), self.txt번호.text())
print(self.cmd)
self.cur.execute(self.cmd)
self.conn.commit()
except:
QMessageBox.information(self, "삽입 오류", "올바른 형식으로 입력하세요.",
QMessageBox.Yes, QMessageBox.Yes)
return
else:
QMessageBox.information(self, "입력 오류", "빈칸 없이 입력하세요.",
QMessageBox.Yes, QMessageBox.Yes)
return
QMessageBox.information(self, "수정 성공", "수정되었습니다.",
QMessageBox.Yes, QMessageBox.Yes)

def slt(self):
# print(self.리스트.currentIndex().row())
self.txt번호.setText(str(self.내용.index(self.리스트.currentIndex().row(), 0).data()))
self.txt이름.setText(self.내용.index(self.리스트.currentIndex().row(), 1).data())
self.txt주소.setText(self.내용.index(self.리스트.currentIndex().row(), 2).data())

def new(self):
self.cur.execute("select max(no) from test2") # 행 갯수 가져오기
self.conn.commit()
self.cnt = self.cur.fetchone()
k.show()

def resizeEvent(self, QResizeEvent):
self.btnX = self.width() - 220
self.btnY = self.height() -60

self.cmd이전.move(self.btnX, self.btnY)
self.cmd다음.move(self.btnX + self.btnSize*1, self.btnY)
self.cmd신규.move(self.btnX + self.btnSize*2, self.btnY)
self.cmd수정.move(self.btnX + self.btnSize*3, self.btnY)
self.cmd삭제.move(self.btnX + self.btnSize*4, self.btnY)

def closeEvent(self, QCloseEvent):
self.conn.close()

def enterEvent(self, QEvent):
self.cmd = "select * from test2"
self.cur.execute(self.cmd)
self.conn.commit()
ar = self.cur.fetchall() # 튜플

self.내용.removeRow(len(ar))

for i in range(len(ar)):
self.내용.removeRow(i)
self.내용.insertRow(i)
self.내용.setData(self.내용.index(i,0), ar[i][0])
self.내용.setData(self.내용.index(i,1), ar[i][1])
self.내용.setData(self.내용.index(i,2), ar[i][2])

self.txt번호.clear()
self.txt이름.clear()
self.txt주소.clear()

def showEvent(self, QShowEvent):
# def start_widget(self):
self.cmd = "select * from test2"
self.cur.execute(self.cmd)
self.conn.commit()
ar = self.cur.fetchall() # 튜플

self.내용.removeRow(len(ar))

for i in range(len(ar)):
self.내용.removeRow(i)
self.내용.insertRow(i)
self.내용.setData(self.내용.index(i,0), ar[i][0])
self.내용.setData(self.내용.index(i,1), ar[i][1])
self.내용.setData(self.내용.index(i,2), ar[i][2])

self.txt번호.clear()
self.txt이름.clear()
self.txt주소.clear()

app = QApplication(sys.argv) # Application 오브젝트 생성-쉘스크립트에서 실행할 때 명령줄로 인수를 받을 수 있는데
w = sql() # 객체생성 - 초기에 생성되는 창
k = insert() # 지금 디자인하고 있는 창 - 내부 창
sys.exit(app.exec_()) # 프로그램 종료-이벤트처리를 위한 메인루프 실행-창을 닫을 때

https://www.youtube.com/watch?v=YO6fmMfdZDw&list=PL1eLKSeW1Baj72go6l3gg4C8TXRNUBdMo&index=19