QTableWidget 과 Database 연동 > Pyside6 - GUI for Python

본문 바로가기
사이트 내 전체검색

회원로그인

올서베이넷
무료 온라인 설문 사이트
OVITII
웹 프레젠테이션 도구

Pyside6 - GUI for Python

QTableWidget 과 Database 연동

페이지정보

글쓴이 관리자 조회 52,957 조회 날짜 19-06-13 00:56 / Update:22-12-05 01:57
댓글 0 댓글

SNS 공유

  • 트위터로 보내기
  • 페이스북으로 보내기
  • 구글플러스로 보내기

내용

QTableWidget 과 Database 연동

 

QTableWidget의 화면에 Database를 연동하여 이름과 나이를 저장하는 프로그램을 만들어본다.

 

QPushButton, QLineEdit의 사용법 - https://www.jbmpa.com/pyside6/5

QTableWidget의 사용법 - https://www.jbmpa.com/pyside6/6

Database의 기초 - https://www.jbmpa.com/python_basic/27

Database - Sqlite3 사용법 - https://www.jbmpa.com/python_basic/28

 

 

전체소스 코드 - 코드에 대한 설명은 코드 내부의 주석으로 대신한다.

import sys
import os
import sqlite3 as sq
from PySide6 import QtUiTools, QtGui
from PySide6.QtWidgets import QApplication, QMainWindow, QTableWidgetItem

 

#database 이름 설정
Databasename = "nametable.db"


class MainView(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setupUI()

 

    def setupUI(self):
        global UI_set


        #UI 파일 로딩
        UI_set = QtUiTools.QUiLoader().load(resource_path("tablewidgettest.ui"))
        
        #버튼 클릭시 데이터 입력을 위해 연결할 클래스 외부 함수
        UI_set.pushButton.clicked.connect(InsertData)
        
        #Table의 내부 셀을 클릭할 때 연결할 클래스 외부 함수
        #셀을 클릭하여 연결한 함수에는 기본적으로 셀의 Row, Column 두개의 인자를 넘겨준다.

        UI_set.tableWidget.cellClicked.connect(DeleteData)
                
        #Table 기본 세팅위해 내부 메서드 호출
        self.setTable()
                        
        #데이터베이스 세팅을 위해 외부 함수 호출
        CreateTable()
        
        #데이터베이스 세팅 후, DB 값 불러오기외부 함수 호출
        SelectData()
                
        # GUI 화면 출력
        self.setCentralWidget(UI_set)
        self.setWindowTitle("GUI Program Test")
        self.setWindowIcon(QtGui.QPixmap(resource_path("./images/jbmpa.png")))
        self.resize(510,640)
        self.show()
        
        
    def setTable(self):
        #Table 가로(column) 갯수
        UI_set.tableWidget.setColumnCount(4)
        
        #Table 칼럼 헤더 라벨
        UI_set.tableWidget.setHorizontalHeaderLabels(['번호','이름','나이','삭제'])

 

def CreateTable():
    #sqlite3 db 파일 접속, 없으면 생성
    conn = sq.connect(Databasename)
    cur = conn.cursor()
    
    #db에 aaa라는 테이블이 있는지 sqlite3의 마스터 테이블에서 정보를 받아온다.
    sql = "SELECT name FROM sqlite_master WHERE type='table' AND name ='aaa'"
    cur.execute(sql)
    rows = cur.fetchall()
        
    #aaa 테이블이 없으면 새로 생성하고,  있으면 통과
    if not rows:        
        sql = "CREATE TABLE aaa (idx INTEGER PRIMARY KEY, name TEXT, age INTEGER)"
        cur.execute(sql)
        conn.commit()
    
    conn.close()
    
def InsertData():
    #두개의 lineEdit에서 각각 이름과 나이를 받아온다.  
    name = UI_set.lineEdit.text()
    age = UI_set.lineEdit_2.text()
    
    conn = sq.connect(Databasename)
    cur = conn.cursor()
    
    sql = "INSERT INTO aaa (name, age) VALUES (?,?)"
    cur.execute(sql, (name, age))
    conn.commit()
    
    conn.close()
    
    #데이터 입력 후 DB의 내용 불러와서 TableWidget에 넣기 위한 함수 호출
    SelectData()
    
    
def DeleteData(row, column):
    #테이블 내부의 셀 클릭과 연결된 이벤트는 기본적으로 셀의 Row, Column을 인자로써 전달받는다.
    
    #삭제 셀이 눌렸을 때, 삭제 셀은 4번째 셀이므로 column 값이 3일 경우만 작동한다.

    if column == 3: 
        conn = sq.connect(Databasename)
        cur = conn.cursor()
        
        #DB의 데이터 idx는 선택한 Row의 첫번째 셀(0번 Column)의 값에 해당한다.
        idx = UI_set.tableWidget.item(row, 0).text()
        
        sql = "DELETE FROM aaa WHERE idx =?"
        cur.execute(sql, (idx,))
        conn.commit()
        
        conn.close()
        
        #데이터 삭제 후 DB의 내용 불러와서 TableWidget에 넣기 위한 함수 호출
        SelectData()
    
def SelectData():
    #데이터베이스 내부 테이블의 내용을 모두 추출
    conn = sq.connect(Databasename)
    cur = conn.cursor()
    
    sql = "SELECT * FROM aaa"
    cur.execute(sql)
    rows = cur.fetchall()        
    
    conn.close()
    
    #DB의 내용을 불러와서 TableWidget에 넣기 위한 함수 호출
    setTables(rows)


def setTables(row):
    #DB내부에 저장된 결과물의 갯수를 저장한다.        
    count = len(row)
    
    #갯수만큼 테이블의 Row를 생성한다.
    UI_set.tableWidget.setRowCount(count)
    
    #row 리스트만큼 반복하며 Table에 DB 값을 넣는다.
    for x in range(count):
        #리스트 내부의 column쌍은 튜플로 반환하므로 튜플의 각 값을 변수에 저장
        idx, name, age = row[x]
           
        #테이블의 각 셀에 값 입력
        UI_set.tableWidget.setItem(x, 0, QTableWidgetItem(str(idx)))
        UI_set.tableWidget.setItem(x, 1, QTableWidgetItem(name))
        UI_set.tableWidget.setItem(x, 2, QTableWidgetItem(str(age)))
        UI_set.tableWidget.setItem(x, 3, QTableWidgetItem("삭제"))        
    
       
#파일 경로
#pyinstaller로 원파일로 압축할때 경로 필요함

def resource_path(relative_path):
    if hasattr(sys, '_MEIPASS'):
        return os.path.join(sys._MEIPASS, relative_path)
    return os.path.join(os.path.abspath("."), relative_path)
 
if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = MainView()
    #main.show()
    sys.exit(app.exec())

 

 

1269734546_1560408303.593.png

 

 

댓글목록 sfs

총 7 건 , 1 페이지
게시물 검색
Pyside6 - GUI for Python 목록
번호 제목 글쓴이 조회 날짜
1 관리자 41602 05-02
2 관리자 38429 05-03
3 관리자 52571 06-11
열람중 관리자 52958 06-13
5 관리자 44491 12-04
6 관리자 42050 12-04
7 관리자 34377 12-13
GNUBOARD_M
Copyright © JBMPA.com All rights reserved.