PL03-Topic02, PyQt
Back to the previous page|API for python| API for C++|page management
List of posts to read before reading this article
Contents
- Installation
- Basic
- Layout
- Widget
- Dialog
- Signal and slot
- Building .exe file
- Macro
- Reference and several tips
Installation
For linux
$ apt install python3-tk
$ apt install python3-pyqt5
For windows
$ pip install pyqt5
Version Control
Basic
Open window
basic form
import sys
from PyQt5.QtWidgets import QApplication, QDialog
app = QApplication(sys.argv)
mainDialog = QDialog()
mainDialog.show()
app.exec_()
advanced form
import sys
from PyQt5.QtWidgets import QApplication, QWidget
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('My First Application')
self.move(300, 300)
self.resize(400, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Add an icon to application
import sys
from PyQt5.QtWidgets import QApplication, QWidget
from PyQt5.QtGui import QIcon
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Icon')
self.setWindowIcon(QIcon('web.png'))
self.setGeometry(300, 800, 500, 500)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Cloes window
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton
from PyQt5.QtCore import QCoreApplication
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn = QPushButton('Quit', self)
btn.move(50, 50)
btn.resize(btn.sizeHint())
btn.clicked.connect(QCoreApplication.instance().quit)
self.setWindowTitle('Quit Button')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Show Tooltips
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QToolTip
from PyQt5.QtGui import QFont
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
QToolTip.setFont(QFont('SansSerif', 10))
self.setToolTip('This is a <b>QWidget</b> widget')
btn = QPushButton('Button', self)
btn.setToolTip('This is a <b>QPushButton</b> widget')
btn.move(50, 50)
btn.resize(btn.sizeHint())
self.setWindowTitle('Tooltips')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Status Bar
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.statusBar().showMessage('Ready')
self.setWindowTitle('Statusbar')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Menubar
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
self.statusBar()
menubar = self.menuBar()
menubar.setNativeMenuBar(False)
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(exitAction)
self.setWindowTitle('Menubar')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Toolbar
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QAction, qApp
from PyQt5.QtGui import QIcon
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
exitAction = QAction(QIcon('exit.png'), 'Exit', self)
exitAction.setShortcut('Ctrl+Q')
exitAction.setStatusTip('Exit application')
exitAction.triggered.connect(qApp.quit)
self.statusBar()
self.toolbar = self.addToolBar('Exit')
self.toolbar.addAction(exitAction)
self.setWindowTitle('Toolbar')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Set the window in the center of the monitor screen
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QDesktopWidget
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Centering')
self.resize(500, 350)
self.center()
self.show()
def center(self):
qr = self.frameGeometry()
cp = QDesktopWidget().availableGeometry().center()
qr.moveCenter(cp)
self.move(qr.topLeft())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT
Date and time
OUTPUT
Style decoration
import sys
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl_red = QLabel('Red')
lbl_green = QLabel('Green')
lbl_blue = QLabel('Blue')
lbl_red.setStyleSheet("color: red;"
"border-style: solid;"
"border-width: 2px;"
"border-color: #FA8072;"
"border-radius: 3px")
lbl_green.setStyleSheet("color: green;"
"background-color: #7FFFD4")
lbl_blue.setStyleSheet("color: blue;"
"background-color: #87CEFA;"
"border-style: dashed;"
"border-width: 3px;"
"border-color: #1E90FF")
vbox = QVBoxLayout()
vbox.addWidget(lbl_red)
vbox.addWidget(lbl_green)
vbox.addWidget(lbl_blue)
self.setLayout(vbox)
self.setWindowTitle('Stylesheet')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Layout
Absolute positioning
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QPushButton
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label1 = QLabel('Label1', self)
label1.move(20, 20)
label2 = QLabel('Label2', self)
label2.move(20, 60)
btn1 = QPushButton('Button1', self)
btn1.move(80, 13)
btn2 = QPushButton('Button2', self)
btn2.move(80, 53)
self.setWindowTitle('Absolute Positioning')
self.setGeometry(300, 300, 400, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Box layout
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QHBoxLayout, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
okButton = QPushButton('OK')
cancelButton = QPushButton('Cancel')
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(okButton)
hbox.addWidget(cancelButton)
hbox.addStretch(1)
vbox = QVBoxLayout()
vbox.addStretch(3)
vbox.addLayout(hbox)
vbox.addStretch(1)
self.setLayout(vbox)
self.setWindowTitle('Box Layout')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Grid layout
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGridLayout, QLabel, QLineEdit, QTextEdit)
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
grid = QGridLayout()
self.setLayout(grid)
grid.addWidget(QLabel('Title:'), 0, 0)
grid.addWidget(QLabel('Author:'), 1, 0)
grid.addWidget(QLabel('Review:'), 2, 0)
grid.addWidget(QLineEdit(), 0, 1)
grid.addWidget(QLineEdit(), 1, 1)
grid.addWidget(QTextEdit(), 2, 1)
self.setWindowTitle('QGridLayout')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Widget
QPushButton
| method | description |
|---|---|
| setCheckable() | True 설정 시, 누른 상태와 그렇지 않은 상태를 구분합니다. |
| toggle() | 상태를 바꿉니다. |
| setIcon() | 버튼의 아이콘을 설정합니다. |
| setEnabled() | False 설정 시, 버튼을 사용할 수 없습니다. |
| isChecked() | 버튼의 선택 여부를 반환합니다. |
| setText() | 버튼에 표시될 텍스트를 설정합니다. |
| text() | 버튼에 표시된 텍스트를 반환합니다. |
| signal | description |
|---|---|
| clicked() | 버튼을 클릭할 때 발생합니다. |
| pressed() | 버튼이 눌렸을 때 발생합니다. |
| released() | 버튼을 눌렀다 뗄 때 발생합니다. |
| toggled() | 버튼의 상태가 바뀔 때 발생합니다. |
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QVBoxLayout
from PyQt5.QtGui import QIcon, QPixmap
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn1 = QPushButton('&Button1', self)
btn1.setCheckable(True)
btn1.toggle()
btn2 = QPushButton(self)
btn2.setText('Button&2')
btn3 = QPushButton('Button3', self)
btn3.setEnabled(False)
vbox = QVBoxLayout()
vbox.addWidget(btn1)
vbox.addWidget(btn2)
vbox.addWidget(btn3)
self.setLayout(vbox)
self.setWindowTitle('QPushButton')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QLabel
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
label1 = QLabel('First Label', self)
label1.setAlignment(Qt.AlignCenter)
label2 = QLabel('Second Label', self)
label2.setAlignment(Qt.AlignVCenter)
font1 = label1.font()
font1.setPointSize(20)
font2 = label2.font()
font2.setFamily('Times New Roman')
font2.setBold(True)
label1.setFont(font1)
label2.setFont(font2)
layout = QVBoxLayout()
layout.addWidget(label1)
layout.addWidget(label2)
self.setLayout(layout)
self.setWindowTitle('QLabel')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QCheckBox
| method | description |
|---|---|
| text() | 체크 박스의 라벨 텍스트를 반환합니다. |
| setText() | 체크 박스의 라벨 텍스트를 설정합니다. |
| isChecked() | 체크 박스의 상태를 반환합니다. (True/False) |
| checkState() | 체크 박스의 상태를 반환합니다. (2/1/0) |
| toggle() | 체크 박스의 상태를 변경합니다. |
| pressed() | 체크 박스를 누를 때 신호를 발생합니다. |
| released() | 체크 박스에서 뗄 때 신호를 발생합니다. |
| clicked() | 체크 박스를 클릭할 때 신호를 발생합니다. |
| stateChanged() | 체크 박스의 상태가 바뀔 때 신호를 발생합니다. |
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QCheckBox
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
cb = QCheckBox('Show title', self)
cb.move(20, 20)
cb.toggle()
cb.stateChanged.connect(self.changeTitle)
self.setWindowTitle('QCheckBox')
self.setGeometry(300, 300, 300, 200)
self.show()
def changeTitle(self, state):
if state == Qt.Checked:
self.setWindowTitle('QCheckBox')
else:
self.setWindowTitle(' ')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT
QRadioButton
| method | description |
|---|---|
| text() | 버튼의 텍스트를 반환합니다. |
| setText() | 라벨에 들어갈 텍스트를 설정합니다. |
| setChecked() | 버튼의 선택 여부를 설정합니다. |
| isChecked() | 버튼의 선택 여부를 반환합니다. |
| toggle() | 버튼의 상태를 변경합니다. |
| signal | description |
|---|---|
| pressed() | 버튼을 누를 때 신호를 발생합니다. |
| released() | 버튼에서 뗄 때 신호를 발생합니다. |
| clicked() | 버튼을 클릭할 때 신호를 발생합니다. |
| toggled() | 버튼의 상태가 바뀔 때 신호를 발생합니다. |
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QRadioButton
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
rbtn1 = QRadioButton('First Button', self)
rbtn1.move(50, 50)
rbtn1.setChecked(True)
rbtn2 = QRadioButton(self)
rbtn2.move(50, 70)
rbtn2.setText('Second Button')
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('QRadioButton')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QComboBox
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QComboBox
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.lbl = QLabel('Option1', self)
self.lbl.move(50, 150)
cb = QComboBox(self)
cb.addItem('Option1')
cb.addItem('Option2')
cb.addItem('Option3')
cb.addItem('Option4')
cb.move(50, 50)
cb.activated[str].connect(self.onActivated)
self.setWindowTitle('QComboBox')
self.setGeometry(300, 300, 300, 200)
self.show()
def onActivated(self, text):
self.lbl.setText(text + ' was selected')
self.lbl.adjustSize()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QLineEdit
| constant | value | description |
|---|---|---|
| QLineEdit.Normal | 0 | 입력된 문자를 표시합니다. (기본값) |
| QLineEdit.NoEcho | 1 | 문자열을 표시하지 않습니다. 이 설정은 비밀번호의 글자수도 공개하지 않을 때 유용합니다. |
| QLineEdit.Password | 2 | 입력된 문자 대신 비밀번호 가림용 문자를 표시합니다. |
| QLineEdit.PasswordEchoOnEdit | 3 | 입력할 때만 문자를 표시하고, 수정 중에는 다른 문자를 표시합니다. |
| method | description |
|---|---|
| signal | description |
|---|---|
| cursorPositionChanged() | 커서가 움직일 때 발생하는 신호를 발생합니다. |
| editingFinished() | 편집이 끝났을 때 (Return/Enter 버튼이 눌릴 때) 신호를 발생합니다. |
| returnPressed() | Return/Enter 버튼이 눌릴 때 신호를 발생합니다. |
| selectionChanged() | 선택 영역이 바뀔 때 신호를 발생합니다. |
| textChanged() | 텍스트가 변경될 때 신호를 발생합니다. |
| textEdited() | 텍스트가 편집될 때 신호를 발생합니다. |
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QLineEdit
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.lbl = QLabel(self)
self.lbl.move(10, 40)
qle = QLineEdit(self)
qle.move(10, 150)
qle.textChanged[str].connect(self.onChanged)
self.setWindowTitle('QLineEdit')
self.setGeometry(300, 300, 300, 200)
self.show()
def onChanged(self, text):
self.lbl.setText(text)
self.lbl.adjustSize()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QProgressBar
| constant | value | description |
|---|---|---|
| QSlider.NoTicks | 0 | 틱을 표시하지 않습니다. |
| QSlider.TicksAbove | 1 | 틱을 (수평) 슬라이더 위쪽에 표시합니다. |
| QSlider.TicksBelow | 2 | 틱을 (수평) 슬라이더 아래쪽에 표시합니다. |
| QSlider.TicksBothSides | 3 | 틱을 (수평) 슬라이더 양쪽에 표시합니다. |
| QSlider.TicksLeft | TicksAbove | 틱을 (수직) 슬라이더 왼쪽에 표시합니다. |
| QSlider.TicksRight | TicksBelow | 틱을 (수직) 슬라이더 오른쪽에 표시합니다. |
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QProgressBar
from PyQt5.QtCore import QBasicTimer
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.pbar = QProgressBar(self)
self.pbar.setGeometry(30, 40, 200, 25)
self.btn = QPushButton('Start', self)
self.btn.move(40, 80)
self.btn.clicked.connect(self.doAction)
self.timer = QBasicTimer()
self.step = 0
self.setWindowTitle('QProgressBar')
self.setGeometry(300, 300, 300, 200)
self.show()
def timerEvent(self, e):
if self.step >= 100:
self.timer.stop()
self.btn.setText('Finished')
return
self.step = self.step + 1
self.pbar.setValue(self.step)
def doAction(self):
if self.timer.isActive():
self.timer.stop()
self.btn.setText('Start')
else:
self.timer.start(100, self)
self.btn.setText('Stop')
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QSlider & QDial
official API(QSlider)
& official API(QDial)
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QSlider, QDial, QPushButton
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.slider = QSlider(Qt.Horizontal, self)
self.slider.move(30, 30)
self.slider.setRange(0, 50)
self.slider.setSingleStep(2)
self.dial = QDial(self)
self.dial.move(30, 50)
self.dial.setRange(0, 50)
btn = QPushButton('Default', self)
btn.move(35, 160)
self.slider.valueChanged.connect(self.dial.setValue)
self.dial.valueChanged.connect(self.slider.setValue)
btn.clicked.connect(self.button_clicked)
self.setWindowTitle('QSlider and QDial')
self.setGeometry(300, 300, 400, 200)
self.show()
def button_clicked(self):
self.slider.setValue(0)
self.dial.setValue(0)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QSplitter
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QHBoxLayout, QFrame, QSplitter
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
hbox = QHBoxLayout()
top = QFrame()
top.setFrameShape(QFrame.Box)
midleft = QFrame()
midleft.setFrameShape(QFrame.StyledPanel)
midright = QFrame()
midright.setFrameShape(QFrame.Panel)
bottom = QFrame()
bottom.setFrameShape(QFrame.WinPanel)
bottom.setFrameShadow(QFrame.Sunken)
splitter1 = QSplitter(Qt.Horizontal)
splitter1.addWidget(midleft)
splitter1.addWidget(midright)
splitter2 = QSplitter(Qt.Vertical)
splitter2.addWidget(top)
splitter2.addWidget(splitter1)
splitter2.addWidget(bottom)
hbox.addWidget(splitter2)
self.setLayout(hbox)
self.setGeometry(300, 300, 300, 200)
self.setWindowTitle('QSplitter')
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QGroupBox
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QGroupBox, QRadioButton, QCheckBox, QPushButton, QMenu, QGridLayout, QVBoxLayout)
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
grid = QGridLayout()
grid.addWidget(self.createFirstExclusiveGroup(), 0, 0)
grid.addWidget(self.createSecondExclusiveGroup(), 1, 0)
grid.addWidget(self.createNonExclusiveGroup(), 0, 1)
grid.addWidget(self.createPushButtonGroup(), 1, 1)
self.setLayout(grid)
self.setWindowTitle('Box Layout')
self.setGeometry(300, 300, 480, 320)
self.show()
def createFirstExclusiveGroup(self):
groupbox = QGroupBox('Exclusive Radio Buttons')
radio1 = QRadioButton('Radio1')
radio2 = QRadioButton('Radio2')
radio3 = QRadioButton('Radio3')
radio1.setChecked(True)
vbox = QVBoxLayout()
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addWidget(radio3)
groupbox.setLayout(vbox)
return groupbox
def createSecondExclusiveGroup(self):
groupbox = QGroupBox('Exclusive Radio Buttons')
groupbox.setCheckable(True)
groupbox.setChecked(False)
radio1 = QRadioButton('Radio1')
radio2 = QRadioButton('Radio2')
radio3 = QRadioButton('Radio3')
radio1.setChecked(True)
checkbox = QCheckBox('Independent Checkbox')
checkbox.setChecked(True)
vbox = QVBoxLayout()
vbox.addWidget(radio1)
vbox.addWidget(radio2)
vbox.addWidget(radio3)
vbox.addWidget(checkbox)
vbox.addStretch(1)
groupbox.setLayout(vbox)
return groupbox
def createNonExclusiveGroup(self):
groupbox = QGroupBox('Non-Exclusive Checkboxes')
groupbox.setFlat(True)
checkbox1 = QCheckBox('Checkbox1')
checkbox2 = QCheckBox('Checkbox2')
checkbox2.setChecked(True)
tristatebox = QCheckBox('Tri-state Button')
tristatebox.setTristate(True)
vbox = QVBoxLayout()
vbox.addWidget(checkbox1)
vbox.addWidget(checkbox2)
vbox.addWidget(tristatebox)
vbox.addStretch(1)
groupbox.setLayout(vbox)
return groupbox
def createPushButtonGroup(self):
groupbox = QGroupBox('Push Buttons')
groupbox.setCheckable(True)
groupbox.setChecked(True)
pushbutton = QPushButton('Normal Button')
togglebutton = QPushButton('Toggle Button')
togglebutton.setCheckable(True)
togglebutton.setChecked(True)
flatbutton = QPushButton('Flat Button')
flatbutton.setFlat(True)
popupbutton = QPushButton('Popup Button')
menu = QMenu(self)
menu.addAction('First Item')
menu.addAction('Second Item')
menu.addAction('Third Item')
menu.addAction('Fourth Item')
popupbutton.setMenu(menu)
vbox = QVBoxLayout()
vbox.addWidget(pushbutton)
vbox.addWidget(togglebutton)
vbox.addWidget(flatbutton)
vbox.addWidget(popupbutton)
vbox.addStretch(1)
groupbox.setLayout(vbox)
return groupbox
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QTabWidget
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QTabWidget, QVBoxLayout)
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
tab1 = QWidget()
tab2 = QWidget()
tabs = QTabWidget()
tabs.addTab(tab1, 'Tab1')
tabs.addTab(tab2, 'Tab2')
vbox = QVBoxLayout()
vbox.addWidget(tabs)
self.setLayout(vbox)
self.setWindowTitle('QTabWidget')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Advanced
import sys
from PyQt5.QtWidgets import *
class MyApp(QDialog):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
tabs = QTabWidget()
tabs.addTab(FirstTab(), 'First')
tabs.addTab(SecondTab(), 'Second')
tabs.addTab(ThirdTab(), 'Third')
buttonbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel)
buttonbox.accepted.connect(self.accept)
buttonbox.rejected.connect(self.reject)
vbox = QVBoxLayout()
vbox.addWidget(tabs)
vbox.addWidget(buttonbox)
self.setLayout(vbox)
self.setWindowTitle('QTabWidget')
self.setGeometry(300, 300, 400, 300)
self.show()
class FirstTab(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
name = QLabel('Name:')
nameedit = QLineEdit()
age = QLabel('Age:')
ageedit = QLineEdit()
nation = QLabel('Nation:')
nationedit = QLineEdit()
vbox = QVBoxLayout()
vbox.addWidget(name)
vbox.addWidget(nameedit)
vbox.addWidget(age)
vbox.addWidget(ageedit)
vbox.addWidget(nation)
vbox.addWidget(nationedit)
vbox.addStretch()
self.setLayout(vbox)
class SecondTab(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lan_group = QGroupBox('Select Your Language')
combo = QComboBox()
list = ['Korean', 'English', 'Chinese']
combo.addItems(list)
vbox1 = QVBoxLayout()
vbox1.addWidget(combo)
lan_group.setLayout(vbox1)
learn_group = QGroupBox('Select What You Want To Learn')
korean = QCheckBox('Korean')
english = QCheckBox('English')
chinese = QCheckBox('Chinese')
vbox2 = QVBoxLayout()
vbox2.addWidget(korean)
vbox2.addWidget(english)
vbox2.addWidget(chinese)
learn_group.setLayout(vbox2)
vbox = QVBoxLayout()
vbox.addWidget(lan_group)
vbox.addWidget(learn_group)
self.setLayout(vbox)
class ThirdTab(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl = QLabel('Terms and Conditions')
text_browser = QTextBrowser()
text_browser.setText('This is the terms and conditions')
checkbox = QCheckBox('Check the terms and conditions.')
vbox = QVBoxLayout()
vbox.addWidget(lbl)
vbox.addWidget(text_browser)
vbox.addWidget(checkbox)
self.setLayout(vbox)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QPixmap
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout
from PyQt5.QtGui import QPixmap
from PyQt5.QtCore import Qt
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
pixmap = QPixmap('landscape.jpg')
lbl_img = QLabel()
lbl_img.setPixmap(pixmap)
lbl_size = QLabel('Width: '+str(pixmap.width())+', Height: '+str(pixmap.height()))
lbl_size.setAlignment(Qt.AlignCenter)
vbox = QVBoxLayout()
vbox.addWidget(lbl_img)
vbox.addWidget(lbl_size)
self.setLayout(vbox)
self.setWindowTitle('QPixmap')
self.move(300, 300)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QCalendarWidget
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLabel, QVBoxLayout, QCalendarWidget)
from PyQt5.QtCore import QDate
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
cal = QCalendarWidget(self)
cal.setGridVisible(True)
cal.clicked[QDate].connect(self.showDate)
self.lbl = QLabel(self)
date = cal.selectedDate()
self.lbl.setText(date.toString())
vbox = QVBoxLayout()
vbox.addWidget(cal)
vbox.addWidget(self.lbl)
self.setLayout(vbox)
self.setWindowTitle('QCalendarWidget')
self.setGeometry(300, 300, 400, 300)
self.show()
def showDate(self, date):
self.lbl.setText(date.toString())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QSpinBox
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QSpinBox, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.lbl1 = QLabel('QSpinBox')
self.spinbox = QSpinBox()
self.spinbox.setMinimum(-10)
self.spinbox.setMaximum(30)
# self.spinbox.setRange(-10, 30)
self.spinbox.setSingleStep(2)
self.lbl2 = QLabel('0')
self.spinbox.valueChanged.connect(self.value_changed)
vbox = QVBoxLayout()
vbox.addWidget(self.lbl1)
vbox.addWidget(self.spinbox)
vbox.addWidget(self.lbl2)
vbox.addStretch()
self.setLayout(vbox)
self.setWindowTitle('QSpinBox')
self.setGeometry(300, 300, 300, 200)
self.show()
def value_changed(self):
self.lbl2.setText(str(self.spinbox.value()))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QDoubleSpinBox
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QDoubleSpinBox, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.lbl1 = QLabel('QDoubleSpinBox')
self.dspinbox = QDoubleSpinBox()
self.dspinbox.setRange(0, 100)
self.dspinbox.setSingleStep(0.5)
self.dspinbox.setPrefix('$ ')
self.dspinbox.setDecimals(1)
self.lbl2 = QLabel('$ 0.0')
self.dspinbox.valueChanged.connect(self.value_changed)
vbox = QVBoxLayout()
vbox.addWidget(self.lbl1)
vbox.addWidget(self.dspinbox)
vbox.addWidget(self.lbl2)
vbox.addStretch()
self.setLayout(vbox)
self.setWindowTitle('QDoubleSpinBox')
self.setGeometry(300, 300, 300, 200)
self.show()
def value_changed(self):
self.lbl2.setText('$ '+str(self.dspinbox.value()))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QDateEdit
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QDateEdit, QVBoxLayout
from PyQt5.QtCore import QDate
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl = QLabel('QDateEdit')
dateedit = QDateEdit(self)
dateedit.setDate(QDate.currentDate())
dateedit.setMinimumDate(QDate(1900, 1, 1))
dateedit.setMaximumDate(QDate(2100, 12, 31))
# dateedit.setDateRange(QDate(1900, 1, 1), QDate(2100, 12, 31))
vbox = QVBoxLayout()
vbox.addWidget(lbl)
vbox.addWidget(dateedit)
vbox.addStretch()
self.setLayout(vbox)
self.setWindowTitle('QDateEdit')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QTimeEdit
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QTimeEdit, QVBoxLayout
from PyQt5.QtCore import QTime
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl = QLabel('QTimeEdit')
timeedit = QTimeEdit(self)
timeedit.setTime(QTime.currentTime())
timeedit.setTimeRange(QTime(3, 00, 00), QTime(23, 30, 00))
timeedit.setDisplayFormat('hh:mm:ss')
vbox = QVBoxLayout()
vbox.addWidget(lbl)
vbox.addWidget(timeedit)
vbox.addStretch()
self.setLayout(vbox)
self.setWindowTitle('QTimeEdit')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QDateTimeEdit
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QDateTimeEdit, QVBoxLayout
from PyQt5.QtCore import QDateTime
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lbl = QLabel('QTimeEdit')
datetimeedit = QDateTimeEdit(self)
datetimeedit.setDateTime(QDateTime.currentDateTime())
datetimeedit.setDateTimeRange(QDateTime(1900, 1, 1, 00, 00, 00), QDateTime(2100, 1, 1, 00, 00, 00))
datetimeedit.setDisplayFormat('yyyy.MM.dd hh:mm:ss')
vbox = QVBoxLayout()
vbox.addWidget(lbl)
vbox.addWidget(datetimeedit)
vbox.addStretch()
self.setLayout(vbox)
self.setWindowTitle('QDateTimeEdit')
self.setGeometry(300, 300, 300, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QTextBrower
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLineEdit, QTextBrowser, QPushButton, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.le = QLineEdit()
self.le.returnPressed.connect(self.append_text)
self.tb = QTextBrowser()
self.tb.setAcceptRichText(True)
self.tb.setOpenExternalLinks(True)
self.clear_btn = QPushButton('Clear')
self.clear_btn.pressed.connect(self.clear_text)
vbox = QVBoxLayout()
vbox.addWidget(self.le, 0)
vbox.addWidget(self.tb, 1)
vbox.addWidget(self.clear_btn, 2)
self.setLayout(vbox)
self.setWindowTitle('QTextBrowser')
self.setGeometry(300, 300, 300, 300)
self.show()
def append_text(self):
text = self.le.text()
self.tb.append(text)
self.le.clear()
def clear_text(self):
self.tb.clear()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QTextEdit
| method | description |
|---|---|
| signal | description |
|---|---|
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel, QTextEdit, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.lbl1 = QLabel('Enter your sentence:')
self.te = QTextEdit()
self.te.setAcceptRichText(False)
self.lbl2 = QLabel('The number of words is 0')
self.te.textChanged.connect(self.text_changed)
vbox = QVBoxLayout()
vbox.addWidget(self.lbl1)
vbox.addWidget(self.te)
vbox.addWidget(self.lbl2)
vbox.addStretch()
self.setLayout(vbox)
self.setWindowTitle('QTextEdit')
self.setGeometry(300, 300, 300, 200)
self.show()
def text_changed(self):
text = self.te.toPlainText()
self.lbl2.setText('The number of words is ' + str(len(text.split())))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Dialog
QInputDialog
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QLineEdit, QInputDialog
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.btn = QPushButton('Dialog', self)
self.btn.move(30, 30)
self.btn.clicked.connect(self.showDialog)
self.le = QLineEdit(self)
self.le.move(120, 35)
self.setWindowTitle('Input dialog')
self.setGeometry(300, 300, 300, 200)
self.show()
def showDialog(self):
text, ok = QInputDialog.getText(self, 'Input Dialog', 'Enter your name:')
if ok:
self.le.setText(str(text))
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QColorDialog
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QPushButton, QFrame, QColorDialog
from PyQt5.QtGui import QColor
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
col = QColor(0, 0, 0)
self.btn = QPushButton('Dialog', self)
self.btn.move(30, 30)
self.btn.clicked.connect(self.showDialog)
self.frm = QFrame(self)
self.frm.setStyleSheet('QWidget { background-color: %s }' % col.name())
self.frm.setGeometry(130, 35, 100, 100)
self.setWindowTitle('Color Dialog')
self.setGeometry(300, 300, 250, 180)
self.show()
def showDialog(self):
col = QColorDialog.getColor()
if col.isValid():
self.frm.setStyleSheet('QWidget { background-color: %s }' % col.name())
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QFontDialog
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QVBoxLayout, \
QPushButton, QSizePolicy, QLabel, QFontDialog
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
btn = QPushButton('Dialog', self)
btn.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Fixed)
btn.move(20, 20)
btn.clicked.connect(self.showDialog)
vbox = QVBoxLayout()
vbox.addWidget(btn)
self.lbl = QLabel('The quick brown fox jumps over the lazy dog', self)
self.lbl.move(130, 20)
vbox.addWidget(self.lbl)
self.setLayout(vbox)
self.setWindowTitle('Font Dialog')
self.setGeometry(300, 300, 250, 180)
self.show()
def showDialog(self):
font, ok = QFontDialog.getFont()
if ok:
self.lbl.setFont(font)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QFileDialog
import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QTextEdit, QAction, QFileDialog
from PyQt5.QtGui import QIcon
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.textEdit = QTextEdit()
self.setCentralWidget(self.textEdit)
self.statusBar()
openFile = QAction(QIcon('open.png'), 'Open', self)
openFile.setShortcut('Ctrl+O')
openFile.setStatusTip('Open New File')
openFile.triggered.connect(self.showDialog)
menubar = self.menuBar()
menubar.setNativeMenuBar(False)
fileMenu = menubar.addMenu('&File')
fileMenu.addAction(openFile)
self.setWindowTitle('File Dialog')
self.setGeometry(300, 300, 300, 200)
self.show()
def showDialog(self):
fname = QFileDialog.getOpenFileName(self, 'Open file', './')
if fname[0]:
f = open(fname[0], 'r')
with f:
data = f.read()
self.textEdit.setText(data)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

QMessageBox
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QMessageBox
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('QMessageBox')
self.setGeometry(300, 300, 300, 200)
self.show()
def closeEvent(self, event):
reply = QMessageBox.question(self, 'Message', 'Are you sure to quit?',
QMessageBox.Yes | QMessageBox.No, QMessageBox.No)
if reply == QMessageBox.Yes:
event.accept()
else:
event.ignore()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Signal and slot
Connect
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLCDNumber, QDial, QVBoxLayout
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lcd = QLCDNumber(self)
dial = QDial(self)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(dial)
self.setLayout(vbox)
dial.valueChanged.connect(lcd.display)
self.setWindowTitle('Signal and Slot')
self.setGeometry(300, 300, 200, 200)
self.show()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Event handler - Creation
import sys
from PyQt5.QtWidgets import (QApplication, QWidget, QLCDNumber, QDial, QPushButton, QVBoxLayout, QHBoxLayout)
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
lcd = QLCDNumber(self)
dial = QDial(self)
btn1 = QPushButton('Big', self)
btn2 = QPushButton('Small', self)
hbox = QHBoxLayout()
hbox.addWidget(btn1)
hbox.addWidget(btn2)
vbox = QVBoxLayout()
vbox.addWidget(lcd)
vbox.addWidget(dial)
vbox.addLayout(hbox)
self.setLayout(vbox)
dial.valueChanged.connect(lcd.display)
btn1.clicked.connect(self.resizeBig)
btn2.clicked.connect(self.resizeSmall)
self.setWindowTitle('Signal and Slot')
self.setGeometry(200, 200, 200, 250)
self.show()
def resizeBig(self):
self.resize(400, 500)
def resizeSmall(self):
self.resize(200, 250)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Event handler - Reconfiguration(1)
import sys
from PyQt5.QtCore import Qt
from PyQt5.QtWidgets import QApplication, QWidget
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.setWindowTitle('Reimplementing event handler')
self.setGeometry(300, 300, 300, 200)
self.show()
def keyPressEvent(self, e):
if e.key() == Qt.Key_Escape:
self.close()
elif e.key() == Qt.Key_F:
self.showFullScreen()
elif e.key() == Qt.Key_N:
self.showNormal()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Event handler - Reconfiguration(2)
import sys
from PyQt5.QtWidgets import QApplication, QWidget, QLabel
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
x = 0
y = 0
self.text = 'x: {0}, y: {1}'.format(x, y)
self.label = QLabel(self.text, self)
self.label.move(20, 20)
self.setMouseTracking(True)
self.setWindowTitle('Reimplementing event handler')
self.setGeometry(300, 300, 300, 200)
self.show()
def mouseMoveEvent(self, e):
x = e.x()
y = e.y()
text = 'x: {0}, y: {1}'.format(x, y)
self.label.setText(text)
self.label.adjustSize()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT

Custom signal
import sys
from PyQt5.QtCore import pyqtSignal, QObject
from PyQt5.QtWidgets import QApplication, QMainWindow
class Communicate(QObject):
closeApp = pyqtSignal()
class MyApp(QMainWindow):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):
self.c = Communicate()
self.c.closeApp.connect(self.close)
self.setWindowTitle('Emitting Signal')
self.setGeometry(300, 300, 300, 200)
self.show()
def mousePressEvent(self, e):
self.c.closeApp.emit()
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT
Building .exe file
Macro
Macro program(1)
import sys
from PyQt5.QtWidgets import *
from PyQt5.QtCore import QTimer
import win32api, win32con
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.x_le = QLineEdit()
self.y_le = QLineEdit()
self.t_le = QLineEdit()
self.start_btn = QPushButton('Start', self)
self.timer = QTimer()
self.initUI()
def initUI(self):
hbox1 = QHBoxLayout()
hbox1.addWidget(QLabel('x 위치: '))
hbox1.addWidget(self.x_le)
hbox1.addWidget(QLabel('y 위치: '))
hbox1.addWidget(self.y_le)
hbox2 = QHBoxLayout()
hbox2.addStretch(1)
hbox2.addWidget(QLabel('Delay: '))
hbox2.addWidget(self.t_le)
hbox2.addStretch(1)
hbox3 = QHBoxLayout()
hbox3.addStretch(1)
hbox3.addWidget(self.start_btn)
hbox3.addStretch(1)
vbox = QVBoxLayout()
vbox.addLayout(hbox1)
vbox.addLayout(hbox2)
vbox.addLayout(hbox3)
self.setLayout(vbox)
self.start_btn.clicked.connect(self.start_btn_click)
self.setWindowTitle('Repeated Click')
self.setGeometry(300, 300, 300, 200)
self.show()
def start_btn_click(self):
delay = int(self.t_le.text())
self.timer.start(delay*1000)
self.timer.timeout.connect(self.mouse_click)
def mouse_click(self):
x = int(self.x_le.text())
y = int(self.y_le.text())
win32api.SetCursorPos((x, y))
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN, x, y, 0, 0)
win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP, x, y, 0, 0)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT
Macro program(2)
import sys
import pyautogui
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.open_btn = QPushButton('Open Image')
self.label = QLabel()
self.x_le = QLineEdit()
self.y_le = QLineEdit()
self.n_le = QLineEdit()
self.t_le = QLineEdit()
self.click_btn = QPushButton('Click')
self.fname = ''
self.initUI()
def initUI(self):
hbox = QHBoxLayout()
hbox.addStretch(1)
hbox.addWidget(self.label)
hbox.addStretch(1)
hbox2 = QHBoxLayout()
hbox2.addWidget(QLabel('x: '))
hbox2.addWidget(self.x_le)
hbox2.addWidget(QLabel('y: '))
hbox2.addWidget(self.y_le)
hbox3 = QHBoxLayout()
hbox3.addWidget(QLabel('횟수: '))
hbox3.addWidget(self.n_le)
hbox3.addWidget(QLabel('딜레이: '))
hbox3.addWidget(self.t_le)
vbox = QVBoxLayout()
vbox.addWidget(self.open_btn)
vbox.addLayout(hbox)
vbox.addLayout(hbox2)
vbox.addLayout(hbox3)
vbox.addWidget(self.click_btn)
self.setLayout(vbox)
self.open_btn.clicked.connect(self.show_dialog)
self.click_btn.clicked.connect(self.click_btn_clicked)
self.setWindowTitle('Image')
self.setGeometry(300, 300, 300, 300)
self.show()
def show_dialog(self):
fname = QFileDialog.getOpenFileName(self, 'Open file', './')
if fname[0]:
pixmap = QPixmap(fname[0])
self.label.setPixmap(pixmap.scaledToWidth(pixmap.width()*1.1))
self.fname = fname[0]
def click_btn_clicked(self):
n = int(self.n_le.text())
t = float(self.t_le.text())
if self.x_le.text() and self.y_le.text():
x_pos = int(self.x_le.text())
y_pos = int(self.y_le.text())
pyautogui.click(x_pos, y_pos, clicks=n, interval=t)
elif self.fname:
center = pyautogui.locateCenterOnScreen(self.fname)
pyautogui.click(center, clicks=n, interval=t)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT
Macro program(3)
import sys
import pyautogui
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPixmap
class MyApp(QWidget):
def __init__(self):
super().__init__()
self.open_btn = QPushButton('Open Image')
self.label = []
self.x_le = QLineEdit()
self.y_le = QLineEdit()
self.n_le = QLineEdit()
self.t_le = QLineEdit()
self.click_btn = QPushButton('Click')
self.fname = []
self.hbox_label = QHBoxLayout()
self.vbox = QVBoxLayout()
self.initUI()
def initUI(self):
hbox_xy = QHBoxLayout()
hbox_xy.addWidget(QLabel('x: '))
hbox_xy.addWidget(self.x_le)
hbox_xy.addWidget(QLabel('y: '))
hbox_xy.addWidget(self.y_le)
hbox_nt = QHBoxLayout()
hbox_nt.addWidget(QLabel('횟수: '))
hbox_nt.addWidget(self.n_le)
hbox_nt.addWidget(QLabel('딜레이: '))
hbox_nt.addWidget(self.t_le)
self.vbox.addWidget(self.open_btn)
self.vbox.addStretch(1)
self.vbox.addLayout(self.hbox_label)
self.vbox.addStretch(1)
self.vbox.addLayout(hbox_xy)
self.vbox.addLayout(hbox_nt)
self.vbox.addWidget(self.click_btn)
self.setLayout(self.vbox)
self.open_btn.clicked.connect(self.show_dialog)
self.click_btn.clicked.connect(self.click_btn_clicked)
self.setWindowTitle('Image')
self.setGeometry(300, 300, 300, 200)
self.show()
def show_dialog(self):
fname = QFileDialog.getOpenFileName(self, 'Open file', './')
if fname[0]:
pixmap = QPixmap(fname[0])
self.label.append(QLabel())
self.label[-1].setPixmap(pixmap.scaledToWidth(pixmap.width()*1.1))
self.fname.append(fname[0])
self.hbox_label.addWidget(self.label[-1])
def click_btn_clicked(self):
n = int(self.n_le.text())
t = float(self.t_le.text())
if self.x_le.text() and self.y_le.text():
x_pos = int(self.x_le.text())
y_pos = int(self.y_le.text())
pyautogui.click(x_pos, y_pos, clicks=n, interval=t)
elif len(self.fname):
print(self.fname)
for i in range(n):
for j in range(len(self.fname)):
center = pyautogui.locateCenterOnScreen(self.fname[j])
pyautogui.click(center, interval=t)
if __name__ == '__main__':
app = QApplication(sys.argv)
ex = MyApp()
sys.exit(app.exec_())
OUTPUT
Reference and several tips
List of posts followed by this article
Reference
OUTPUT
| method | description |
|---|---|
| signal | description |
|---|---|