Python GUI 프로그래밍 – PyQt5
https://wikidocs.net/book/2944
PyQt 기초
import sys from PyQt5.QtWidgets import * app = QApplication(sys.argv) ###---1) QApplication 클래스의 인스턴스 생성 --- # (sys파일내에 argv라는 리스트) label = QLabel("Hello") # bindingVar = Class("initialVal") label.show() # Instance.method() # QWidget: Must construct a QApplication before a QWidget btn = QPushButton("GutenTag") # 버튼 객체 생성 btn.show() app.exec_() ###---2) 이벤트 루프 생성 ---------------------- # QApplication 인스턴스 생성하고 메서드만 호출
![](http://wikidocs.net/images/page/21873/%EA%B7%B8%EB%A6%BC_3-28.png)
GUI 프로그램의 “기본 코드”
import sys from PyQt5.QtWidgets import * class MyWindow(QMainWindow): def __init__(self): super().__init__() app = QApplication(sys.argv) ###---1) QApplication 클래스의 인스턴스 생성 --- window = MyWindow() window.show() app.exec_() ###---2) 이벤트 루프 생성 ----------------------
이벤트 처리 코드 :: Event with callback
일반적으로 클래스의 메서드는 User가 객체를 생성한 후 객체를 통해 메서드를 직접 호출했지만,
GUI 프로그래밍에서는 이벤트를 발생될 때, Event Loop가 해당 이벤트에 연결되어 있는 메서드를 호출해줍니다.
![](https://onesixx.com/wp-content/uploads/2022/03/image-14.png)
이처럼 User가 직접 메서드를 호출하는 것이 아니라,
이벤트 루프가 메서드를 호출하기 때문에 ‘콜백 함수’라고 부릅니다.
쌩짜
import sys from PyQt5.QtWidgets import * from PyQt5.QtGui import * class MyWindow(QMainWindow): def __init__(self): super().__init__() self.setGeometry(0,200, 300,400) self.setWindowTitle("PyQt5") self.setWindowIcon(QIcon('icon.png')) btn = QPushButton("button 1", self) btn.move(10,10) btn.clicked.connect(self.btn_clicked) btn2 = QPushButton("button 2", self) btn2.move(10,40) def btn_clicked(self): print("Button Clicked") app = QApplication(sys.argv) ###---1) QApplication 클래스의 인스턴스 생성 --- window = MyWindow() window.show() app.exec_() ###---2) 이벤트 루프 생성 ----------------------
QT Desinger
import sys from PyQt5.QtWidgets import * from PyQt5 import uic form_class = uic.loadUiType("basic_qt5.ui")[0] class MyWindow(QMainWindow, form_class): def __init__(self): super().__init__() self.setupUi(self) self.pushButton.clicked.connect(self.btn_clicked) def btn_clicked(self): print("Button Clicked") app = QApplication(sys.argv) ###---1) QApplication 클래스의 인스턴스 생성 --- window = MyWindow() window.show() app.exec_() ###---2) 이벤트 루프 생성 ----------------------
QPushButton에는 ‘clicked’라는 시그널이 있다. (QPushButton클래스의 인스턴스는 btn에 바인딩)
MySignal클래스에는 ‘signal1’이라는 시그널이 있다. (MySignal클래스의 인스턴스는 mysignal에 바인딩)
class MySignal(QObject): signal1 = pyqtSignal() def run(self): self.signal1.emit() class MyWindow(QMainWindow): def __init__(self): super().__init__() mysignal = MySignal() mysignal.signal1.connect(self.signal1_emitted) mysignal.run() @pyqtSlot() def signal1_emitted(self): print("signal1 emitted")
PyQt의 시그널/슬롯을 이용하면 특정 시점에 어떤 클래스에서 다른 클래스로 데이터를 쉽게 보낼수 있음.
import sys from PyQt5.QtWidgets import * from PyQt5 import uic from PyQt5.QtCore import * import pykorbit class MySignal(QObject): signal1 = pyqtSignal() signal2 = pyqtSignal(int, int) def run(self): self.signal1.emit() self.signal2.emit(1,2) form_class = uic.loadUiType("basic_qt5.ui")[0] class MyWindow(QMainWindow, form_class): def __init__(self): super().__init__() self.setupUi(self) mysignal = MySignal() mysignal.signal1.connect(self.signal1_emitted) mysignal.signal2.connect(self.signal2_emitted) mysignal.run() @pyqtSlot() def signal1_emitted(self): print("signal1 emitted") @pyqtSlot(int, int) def signal2_emitted(self, arg1,arg2): print("signal2 emitted", arg1, arg2) app = QApplication(sys.argv) ###---1) QApplication 클래스의 인스턴스 생성 --- window = MyWindow() window.show() app.exec_() ###---2) 이벤트 루프 생성 ----------------------
Dash PyQt5
https://stackoverflow.com/questions/51522463/use-dash-plot-ly-in-pyqt5-gui
import sys import threading from PyQt5 import QtWidgets import dash from dash import dcc from dash import html def run_dash(data, layout): app = dash.Dash() app.layout = html.Div(children=[ html.H1(children='Hello Dash'), html.Div(children=''' Dash: A web application framework for Python. '''), dcc.Graph(id='example-graph', figure={ 'data': data, 'layout': layout }) ]) app.run_server(debug=False) class MainWindow(QtWidgets.QMainWindow): pass if __name__ == '__main__': data = [ {'x': [1, 2, 3], 'y': [4, 1, 2], 'type': 'bar', 'name': 'SF'}, {'x': [1, 2, 3], 'y': [2, 4, 5], 'type': 'bar', 'name': u'Montréal'}, ] layout = { 'title': 'Dash Data Visualization' } threading.Thread(target=run_dash, args=(data, layout), daemon=True).start() app = QtWidgets.QApplication(sys.argv) mainWin = MainWindow() mainWin.show() sys.exit(app.exec_())