pyside2 공부일지
JBM 프로그래밍, GUI 파이썬, Pyside2, Visual python
GUI 파이썬 프로그래밍, Pyside2 실습, Visual python
www.jbmpa.com
# https://www.jbmpa.com/pyside2/2
import sys
import os
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
global UI_set
UI_set = QtUiTools.QUiLoader().load(resource_path("main.ui"))
self.setCentralWidget(UI_set)
self.setWindowTitle("UI TEST")
# self.setWindowIcon(QtGui.QPixmap(resource_path("./images/pysidelogo.png")))
self.resize(500,270)
self.show()
#파일 경로
#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_()) # 메인 루프
# ctrl + enter 다음 줄
# ctrl + (fn) F5 코드 실행
# ctrl + shift + k 현재 행 삭제
# ctrl + / 현재 행 주석
# alt + ↑ 코드 이동
# alt + shift + ↓ 현재 행 복사
=======================
# https://www.jbmpa.com/pyside2/2
import sys
import os
import sqlite3 as sq # ******************
from PySide2 import QtUiTools, QtGui, QtCore
from PySide2.QtWidgets import QApplication, QMainWindow, QHeaderView, QTableWidgetItem
# database 이름 설정
Databasename="nametable.db" # ******************
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
self.setTable() # ******************
def setupUI(self):
global UI_set
# UI 파일 로딩
UI_set = QtUiTools.QUiLoader().load(resource_path("tablewidgettest.ui")) # 수정
# 버튼 클릭시 데이터 입력을 위해 연결할 클래스 외부 함수
UI_set.pushButton.clicked.connect(InsertData) # ******************
# UI_set.pushButton.clicked.connect(self.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/pysidelogo.png")))
self.resize(510,640)
self.show()
def setTable(self): # ******************
#table 가로 갯수 # ******************
UI_set.tableWidget.setColumnCount(4) # ******************
#table 세로 갯수 # ******************
# UI_set.tableWidget.setRowCount(3) # ******************
#table 헤더 라벨 # ******************
UI_set.tableWidget.setHorizontalHeaderLabels(['번호','이름','나이','삭제']) # ******************
#UI_set.tableWidget.setVerticalHeaderLabels(['1','2','3']) # ******************
#테이블 크기에 맞추어 늘려줌 # ******************
# UI_set.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) # ******************
#UI_set.tableWidget.verticalHeader().setSectionResizeMode(QHeaderView.Stretch) # ******************
#UI_set.tableWidget.setSpan(1,0, 1,2) # ******************
#테이블 아이템 입력 # ******************
# for x in range(3): # ******************
# UI_set.tableWidget.setItem(x, 0, QTableWidgetItem("")) # ******************
# UI_set.tableWidget.setItem(x, 1, QTableWidgetItem("")) # ******************
#테이블 각 셀의 스타일 세팅
# 셀의 백그라운드 설정
# UI_set.tableWidget.item(0, 0).setBackground(QtGui.QColor("#FF0000"))
#셀안의 텍스트의 정렬 설정
# UI_set.tableWidget.item(0, 0).setTextAlignment(QtCore.Qt.AlignCenter | QtCore.Qt.AlignVCenter)
#셀안의 텍스트 폰트 설정
# font = QtGui.QFont("맑은 고딕", 16, QtGui.QFont.Normal)
# UI_set.tableWidget.item(0, 0).setFont(font)
#테이블 값 입력
# UI_set.tableWidget.item(0, 0).setText("홍길동")
# def insertData(self): # ******************
# name = UI_set.lineEdit.text() # ******************
# age = UI_set.lineEdit_2.text() # ******************
# UI_set.tableWidget.item(0,0).setText(name) # ******************
# UI_set.tableWidget.item(0,1).setText(age) # ******************
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()
# 비우기
setLineEditDelete()
#데이터 입력 후 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("삭제"))
# lineEdit 내용 지우기
def setLineEditDelete():
UI_set.lineEdit.setText("")
UI_set.lineEdit_2.setText("")
#파일 경로
#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_())
========================================
import sys
import os
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QMessageBox
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
global UI_set
UI_set = QtUiTools.QUiLoader().load(resource_path("messagebox.ui"))
UI_set.BTN_messagebox.clicked.connect(buttonclick)
self.setCentralWidget(UI_set)
self.setWindowTitle("GUI Program Test")
self.setWindowIcon(QtGui.QPixmap(resource_path("./images/pysidelogo.png")))
self.resize(730, 420)
self.show()
def buttonclick():
# 버튼 클릭시 리턴된 결과값을 받아서 필요에 따라 분기하여 사용한다.
result = messageBox()
if result == QMessageBox.Yes:
message = "Yes"
elif result == QMessageBox.No:
message = "No"
elif result == QMessageBox.Cancel:
message = "Cancel"
UI_set.LE_result.setText(message)
def messageBox():
msgBox = QMessageBox()
msgBox.setWindowTitle("Alert Window")
msgBox.setWindowIcon(QtGui.QPixmap("./images/info.png"))
# msgBox.setIcon(QMessageBox.Information)
msgBox.setIcon(QMessageBox.NoIcon)
msgBox.setText("This is title")
msgBox.setInformativeText("This is content")
msgBox.setStandardButtons(QMessageBox.Yes | QMessageBox.No | QMessageBox.Cancel)
msgBox.setDefaultButton(QMessageBox.Yes)
# 클릭한 버튼의 결과를 int로 반환한다.
return msgBox.exec_()
# 파일 경로
# 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_())
# ctrl + enter 다음 줄
# ctrl + (fn) F5 코드 실행
# ctrl + shift + k 현재 행 삭제
# ctrl + / 현재 행 주석
# alt + ↑ 코드 이동
# alt + shift + ↓ 현재 행 복사
=========================
import sys
import os
from PySide2 import QtUiTools, QtGui, QtCore
from PySide2.QtWidgets import QApplication, QMainWindow
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
global UI_set, cbox
UI_set = QtUiTools.QUiLoader().load(resource_path("datetest.ui"))
UI_set.BTN_check.clicked.connect(checkcalendar)
UI_set.Calendar.clicked.connect(inputdate)
self.setCentralWidget(UI_set)
self.setWindowTitle("GUI Program Test")
self.setWindowIcon(QtGui.QPixmap(resource_path("./images/pysidelogo.png")))
self.resize(730, 490)
self.show()
def inputdate():
# Calendar 값 dateEdit에 가져오기
date = UI_set.Calendar.selectedDate()
UI_set.dateEdit.setDate(QtCore.QDate(date))
def checkcalendar():
# 초기화
UI_set.TE_result.setText("")
# 현재 선택된 시간(시스템 시간)을 저장
date = UI_set.Calendar.selectedDate()
UI_set.TE_result.setText(date.toString("yyyy-MM-dd"))
# 현재 선택된 시간을 변경, 자동으로 위젯 페이지 변경
UI_set.Calendar.setSelectedDate(QtCore.QDate(2020, 11, 2))
# 변경된 시간을 다시 저장
date = UI_set.Calendar.selectedDate()
UI_set.TE_result.append(date.toString("yyyy-MM-dd"))
# 달력 위젯 페이지만 변경
UI_set.Calendar.setCurrentPage(2020, 11)
# 메서드로 년, 월, 일, 요일 출력하기
UI_set.TE_result.append(str(date))
UI_set.TE_result.append(str(date.year()))
UI_set.TE_result.append(str(date.month()))
UI_set.TE_result.append(str(date.day()))
UI_set.TE_result.append(str(date.dayOfWeek()))
# 파일 경로
# 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_())
====================================
import sys
import os
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow, QFileDialog
from tkinter import *
from tkinter import filedialog
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
global UI_set
UI_set = QtUiTools.QUiLoader().load(resource_path("filedialog.ui"))
# self.tr 메서드는 QMainWindow object를 받아 실행하기 때문에
# 클래스 내부에 FilesOpen01 ~ FilesOpen06 메서드를 만듬
UI_set.BTN_filedialog_s1.clicked.connect(self.FilesOpen01)
UI_set.BTN_filedialog_s2.clicked.connect(self.FilesOpen02)
UI_set.BTN_filedialog_s3.clicked.connect(self.FilesOpen03)
UI_set.BTN_filedialog_ns1.clicked.connect(self.FilesOpen04)
UI_set.BTN_filedialog_ns2.clicked.connect(self.FilesOpen05)
UI_set.BTN_filedialog_ns3.clicked.connect(self.FilesOpen06)
UI_set.BTN_tkinter_1.clicked.connect(FileOpen01)
UI_set.BTN_tkinter_2.clicked.connect(FileOpen02)
UI_set.BTN_tkinter_3.clicked.connect(FileOpen03)
self.setCentralWidget(UI_set)
self.setWindowTitle("GUI Program Test")
self.setWindowIcon(QtGui.QPixmap(resource_path("./images/jbmpa.png")))
self.resize(730, 420)
self.show()
# static function 단일 파일
def FilesOpen01(self):
fileName = QFileDialog.getOpenFileName(self, self.tr("Open Data files"), "./",
self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
UI_set.TBrowser.setText(str(fileName))
# static function 다중 파일
def FilesOpen02(self):
fileNames = QFileDialog.getOpenFileNames(self, self.tr("Open Data files"), "./",
self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
UI_set.TBrowser.setText(str(fileNames))
# static function 디렉토리
def FilesOpen03(self):
dirName = QFileDialog.getExistingDirectory(self, self.tr("Open Data files"), "./",
QFileDialog.ShowDirsOnly)
UI_set.TBrowser.setText(str(dirName))
# Non static function 단일 파일
def FilesOpen04(self):
dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.ExistingFile)
dialog.setNameFilter(self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec_():
fileName = dialog.selectedFiles()
UI_set.TBrowser.setText(str(fileName))
# Non static function 다중 파일
def FilesOpen05(self):
dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.ExistingFiles)
dialog.setNameFilter(self.tr("Data Files (*.csv *.xls *.xlsx);; Images (*.png *.xpm *.jpg *.gif);; All Files(*.*)"))
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec_():
fileNames = dialog.selectedFiles()
UI_set.TBrowser.setText(str(fileNames))
# Non static function 단일 파일
def FilesOpen06(self):
dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.Directory)
dialog.setViewMode(QFileDialog.Detail)
if dialog.exec_():
dirName = dialog.selectedFiles()
UI_set.TBrowser.setText(str(dirName))
# tkinter 단일 파일
def FileOpen01():
root = Tk()
root.withdraw()
root.filename = filedialog.askopenfilename(initialdir="./", title="Open Data files",
filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("Images", "*.png *.xpm *.jpg *.gif"),("all files", "*.*")))
UI_set.TBrowser.setText(str(root.filename))
# tkinter 다중 파일
def FileOpen02():
root = Tk()
root.withdraw()
root.filename = filedialog.askopenfilenames(initialdir="./", title="Open Data files",
filetypes=(("data files", "*.csv;*.xls;*.xlsx"), ("Images", "*.png *.xpm *.jpg *.gif"), ("all files", "*.*")))
UI_set.TBrowser.setText(str(root.filename))
# tkinter 디렉토리 파일
def FileOpen03():
root = Tk()
root.withdraw()
root.filename = filedialog.askdirectory(initialdir="./", title="Open Data files")
UI_set.TBrowser.setText(str(root.filename))
# 파일 경로
# 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_())
====================================
import sys
import os
from PySide2 import QtUiTools, QtGui, QtCore
from PySide2.QtWidgets import QApplication, QMainWindow
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
global UI_set, cbox
UI_set = QtUiTools.QUiLoader().load(resource_path("datetest.ui"))
UI_set.BTN_check.clicked.connect(checkcalendar)
UI_set.Calendar.clicked.connect(inputdate)
UI_set.comboBox.currentIndexChanged.connect(checkcombobox)
# comboBox 아이템 모두 삭제
UI_set.comboBox.clear()
# Item 추가
UI_set.comboBox.addItem("Sunny", "data s")
UI_set.comboBox.addItem("Cloudy", "data c")
UI_set.comboBox.addItem("Rainy", "data r")
UI_set.comboBox.addItem("Foggy", "data f")
# comboBox 기본 값 설정
UI_set.comboBox.setCurrentText('Sunny')
self.setCentralWidget(UI_set)
self.setWindowTitle("GUI Program Test")
self.setWindowIcon(QtGui.QPixmap(resource_path("./images/pysidelogo.png")))
self.resize(730, 490)
self.show()
def inputdate():
# Calendar 값 dateEdit에 가져오기
date = UI_set.Calendar.selectedDate()
UI_set.dateEdit.setDate(QtCore.QDate(date))
UI_set.dateTimeEdit.setDate(QtCore.QDate(date))
def checkcombobox():
index = UI_set.comboBox.currentIndex()
text = UI_set.comboBox.currentText()
data = UI_set.comboBox.currentData()
UI_set.TE_result.setText(str(index))
UI_set.TE_result.append(text)
UI_set.TE_result.append(data)
def checkcalendar():
# 초기화
# UI_set.TE_result.setText("")
# UI_set.TE_result.clear()
# 현재 선택된 시간(시스템 시간)을 저장
date = UI_set.Calendar.selectedDate()
UI_set.TE_result.setText(date.toString("yyyy-MM-dd"))
# 현재 선택된 시간을 변경, 자동으로 위젯 페이지 변경
UI_set.Calendar.setSelectedDate(QtCore.QDate(2020, 11, 2))
# 변경된 시간을 다시 저장
date = UI_set.Calendar.selectedDate()
UI_set.TE_result.append(date.toString("yyyy-MM-dd"))
# 달력 위젯 페이지만 변경
UI_set.Calendar.setCurrentPage(2020, 11)
# 메서드로 년, 월, 일, 요일 출력하기
UI_set.TE_result.append(str(date))
UI_set.TE_result.append(str(date.year()))
UI_set.TE_result.append(str(date.month()))
UI_set.TE_result.append(str(date.day()))
UI_set.TE_result.append(str(date.dayOfWeek()))
# 파일 경로
# 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_())
======================
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
# https://www.jbmpa.com/pyside2/2
import sys
import os
from PySide2 import QtUiTools, QtGui
from PySide2.QtWidgets import QApplication, QMainWindow
class MainView(QMainWindow):
def __init__(self):
super().__init__()
self.setupUI()
def setupUI(self):
global UI_set
UI_set = QtUiTools.QUiLoader().load(resource_path("button.ui"))
self.setCentralWidget(UI_set)
self.setWindowTitle("Button Demo")
self.setWindowIcon(QtGui.QPixmap(resource_path("./images/pysidelogo.png")))
self.resize(500,270)
self.show()
UI_set.button.clicked.connect(self.okButtonClicked)
UI_set.checkBox.toggled.connect(self.onCaseSensitivity)
UI_set.button1.toggled.connect(self.onMale)
def okButtonClicked(self):
print('okButtonClicked')
def onCaseSensitivity(self,toggle):
print('okCaseSensitity',toggle)
print(UI_set.checkBox.isChecked())
def onMale(self,toggle):
print('onMale',toggle)
#파일 경로
#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_()) # 메인 루프
===========================
pyside2-uic Logon.ui -o ui_logon.py 고쳐야됨
pyside2-rcc -o Logon_rc.py Logon.qrc 고쳐야됨
==========================
# ctrl + enter 다음 줄
# ctrl + (fn) F5 코드 실행
# ctrl + shift + k 현재 행 삭제
# ctrl + / 현재 행 주석
# alt + ↑ 코드 이동
# alt + shift + ↓ 현재 행 복사
===================================
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
========================================
3.5 폼으로 작성하는 모덜리스 다이얼로그
위키독스
온라인 책을 제작 공유하는 플랫폼 서비스
wikidocs.net
class FindReplaceDialog(QDialog):
find = Signal(str,bool,bool,bool) # find(findText,matchWholeWord,matchCase,upward)
replace = Signal(str,str,bool,bool,bool) # replace(findText,replaceText,matchWoleWord,matchCase,upward)
replaceAll = Signal(str,str,bool,bool,bool) # replaceAll(findText,replaceText,matchWoleWord,matchCase,upward)
def __init__(self,parent=None):
QDialog.__init__(self,parent)
self.ui = Ui_FindReplaceDialog() # 일부 수정
self.ui.setupUi(self) # 일부 수정
self.setWindowTitle("Find/Replace...") # 일부 수정
self.setWindowIcon(QIcon("./images/find.png")) # 일부 수정
# some stuffs for child widget
self.ui.findComboBox.setEditable(True) # 일부 수정
self.ui.replaceComboBox.setEditable(True) # 일부 수정
self.ui.findButton.setDefault(True) # 일부 수정
===================================