Try   HackMD

Введение в PyQt 5

Шаблон программы для PyQt

import sys from PyQt5.QtWidgets import QApplication, QMainWindow # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = QMainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

Widgets

import sys from PyQt5.QtWidgets import * from PyQt5.QtCore import * from PyQt5.QtGui import * # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") layout = QVBoxLayout() widgets = [ QCheckBox, QComboBox, QDateEdit, QDateTimeEdit, QDial, QDoubleSpinBox, QFontComboBox, QLCDNumber, QLabel, QLineEdit, QProgressBar, QPushButton, QRadioButton, QSlider, QSpinBox, QTimeEdit ] for w in widgets: layout.addWidget(w()) widget = QWidget() widget.setLayout(layout) # Установка центрального виджета окна self.setCentralWidget(widget) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QLabel

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QCheckBox from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание метки для вывода текста label = QLabel("Hello, World!") # label.setText("Hello Updated") font = label.font() font.setPointSize(30) label.setFont(font) label.setAlignment(Qt.AlignCenter) # Установка метки как центрального виджета окна self.setCentralWidget(label) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QCheckBox

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QCheckBox from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание виджета widget = QCheckBox("Поставь галочку") widget.setCheckState(Qt.Checked) # widget.setTristate(True) # widget.setCheckState(Qt.PartiallyChecked) widget.stateChanged.connect(self.show_state) # Установка метки как центрального виджета окна self.setCentralWidget(widget) def show_state(self, s): print(s == Qt.Checked) print(s) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QComboBox

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QCheckBox, QComboBox from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание виджета widget = QComboBox() widget.addItems(['Вадим', 'Глеб', 'Сергей']) widget.setCurrentIndex(-1) widget.setEditable(True) widget.setInsertPolicy(QComboBox.InsertAlphabetically) widget.setFixedSize(100, 20) widget.currentIndexChanged.connect(self.index_changed) widget.currentIndexChanged[str].connect(self.text_changed) # Установка метки как центрального виджета окна self.setCentralWidget(widget) def index_changed(self, i): print(i) def text_changed(self, s): print(f'На выход {s}') # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QListBox

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QCheckBox, QListWidget, QAbstractItemView from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание виджета self.widget = QListWidget() self.widget.addItems(['Вадим', 'Глеб', 'Сергей']) self.widget.setSelectionMode(QAbstractItemView.ExtendedSelection) # widget.currentItemChanged.connect(self.index_changed) self.widget.itemClicked.connect(self.item_clicked) # widget.currentTextChanged[str].connect(self.text_changed) # Установка метки как центрального виджета окна self.setCentralWidget(self.widget) def index_changed(self, i): print(i.text()) def text_changed(self, s): print(f'На выход {s}') def item_clicked(self): print(' '.join([item.text() for item in self.widget.selectedItems()])) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QlineEdit

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QCheckBox, QLineEdit from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание виджета self.widget = QLineEdit() self.widget.setMaxLength(10) self.widget.setPlaceholderText("Введите имя") self.widget.returnPressed.connect(self.return_pressed) self.widget.selectionChanged.connect(self.selection_changed) self.widget.textChanged.connect(self.text_changed) self.widget.textEdited.connect(self.text_edited) # Установка метки как центрального виджета окна self.setCentralWidget(self.widget) def return_pressed(self): print(self.widget.text()) self.centralWidget().setText("ПРИВЕТ") def selection_changed(self): print(self.widget.selectedText()) def text_changed(self, s): print('Changed: ' + s) def text_edited(self, s): print('Edited: ' + s) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QPushButton

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QPushButton from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon, QPixmap # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание виджета self.widget = QPushButton(text='Нажми меня') self.widget.clicked.connect(self.button_clicked) # Установка метки как центрального виджета окна self.setCentralWidget(self.widget) def button_clicked(self): self.widget.setText('Кнопка нажата') # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

Layouts

Абсолютное позиционирование

import sys from PyQt5.QtWidgets import * class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Абсолютное позиционирование') self.setFixedSize(250, 130) self.initUI() def initUI(self): label1 = QLabel('Первое число', self) label1.move(10, 5) self.edit1 = QLineEdit('', self) self.edit1.move(10, 30) label2 = QLabel('Второе число', self) label2.move(10, 60) self.edit2 = QLineEdit('', self) self.edit2.move(10, 85) btn = QPushButton('Нажми меня', self) btn.move(120, 30) btn.clicked.connect(self.button_clicked) self.answer = QLabel('Результат', self) self.answer.move(120, 85) font = self.answer.font() font.setWeight(75) self.answer.setFont(font) def button_clicked(self): try: self.answer.setText(str(int(self.edit1.text()) + int(self.edit2.text()))) except ValueError: self.answer.setText('ERROR') # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = Window() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QHBoxLayout, QVBoxLayout

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QHBoxLayout, QVBoxLayout from PyQt5.QtCore import Qt from PyQt5.QtGui import QPalette, QColor # Цветной прямоугольник class Color(QWidget): def __init__(self, color, *args, **kwargs): super().__init__(*args, **kwargs) self.setAutoFillBackground(True) palette = self.palette() palette.setColor(QPalette.Window, QColor(color)) self.setPalette(palette) # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание разметки layout1 = QHBoxLayout() layout2 = QVBoxLayout() layout3 = QVBoxLayout() layout1.setContentsMargins(0, 0, 0, 0) layout1.setSpacing(20) layout2.addWidget(Color('red')) layout2.addWidget(Color('yellow')) layout2.addWidget(Color('purple')) layout1.addLayout(layout2) layout1.addWidget(Color('green')) layout3.addWidget(Color('red')) layout3.addWidget(Color('brown')) layout1.addLayout(layout3) # Создание виджета widget = QWidget() widget.setLayout(layout1) # Установка метки как центрального виджета окна self.setCentralWidget(widget) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QGridLayout

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QWidget, QGridLayout from PyQt5.QtCore import Qt from PyQt5.QtGui import QPalette, QColor # Цветной прямоугольник class Color(QWidget): def __init__(self, color, *args, **kwargs): super().__init__(*args, **kwargs) self.setAutoFillBackground(True) palette = self.palette() palette.setColor(QPalette.Window, QColor(color)) self.setPalette(palette) # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание разметки layout = QGridLayout() layout.setContentsMargins(0, 0, 0, 0) layout.setSpacing(10) layout.addWidget(Color('red'), 0, 0) layout.addWidget(Color('green'), 1, 0) layout.addWidget(Color('blue'), 1, 1) layout.addWidget(Color('purple'), 2, 1) # Создание виджета widget = QWidget() widget.setLayout(layout) # Установка метки как центрального виджета окна self.setCentralWidget(widget) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

QFormLayout

import sys from PyQt5.QtWidgets import * class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Калькулятор') self.initUI() def initUI(self): layout = QFormLayout() self.edit1 = QLineEdit('') layout.addRow('Первое число:', self.edit1) self.edit2 = QLineEdit('') layout.addRow('Второе число:', self.edit2) layout2 = QHBoxLayout() self.answer = QLabel('Результат', self) font = self.answer.font() font.setWeight(75) self.answer.setFont(font) layout2.addWidget(self.answer) btn1 = QPushButton('+', self) btn1.clicked.connect(lambda: self.button_clicked('+')) layout2.addWidget(btn1) btn2 = QPushButton('-', self) btn2.clicked.connect(lambda: self.button_clicked('-')) layout2.addWidget(btn2) btn3 = QPushButton('*', self) btn3.clicked.connect(lambda: self.button_clicked('*')) layout2.addWidget(btn3) btn4 = QPushButton('/', self) btn4.clicked.connect(lambda: self.button_clicked('/')) layout2.addWidget(btn4) row = QWidget() row.setLayout(layout2) layout.addRow(row) widget = QWidget() widget.setLayout(layout) self.setCentralWidget(widget) def button_clicked(self, oper = '+'): try: value1 = float(self.edit1.text()) value2 = float(self.edit2.text()) if oper == '+': answer = value1 + value2 elif oper == '-': answer = value1 - value2 elif oper == '*': answer = value1 * value2 elif oper == '/': answer = value1 / value2 else: answer = 'ERROR' self.answer.setText(str(answer)) except ValueError: self.answer.setText('ERROR') except ZeroDivisionError: self.answer.setText('ERROR') # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = Window() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

Actions

import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QToolBar, \ QAction, QStatusBar, QCheckBox from PyQt5.QtCore import Qt from PyQt5.QtGui import QIcon # Класс для настройки главного окна class MainWindow(QMainWindow): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self.setWindowTitle("Мое PyQt приложение") # Создание метки для вывода текста label = QLabel("Hello, World!") label.setAlignment(Qt.AlignCenter) # Установка метки как центрального виджета окна self.setCentralWidget(label) # Добавление панели инструментов toolbar = QToolBar("Main toolbar") self.addToolBar(toolbar) # Добавление действия button_action = QAction(QIcon("stickman.png"), "Button", self) button_action.setStatusTip("This is your button") button_action.triggered.connect(self.ToolBarButtonClick) button_action.setCheckable(True) toolbar.addAction(button_action) toolbar.addSeparator() button_action2 = QAction(QIcon("folder.png"), "Button2", self) button_action2.setStatusTip("This is your button2") button_action2.triggered.connect(self.ToolBarButtonClick) button_action2.setCheckable(True) toolbar.addAction(button_action2) toolbar.addWidget(QLabel("Check")) toolbar.addWidget(QCheckBox()) # Добавление строки состояния self.setStatusBar(QStatusBar(self)) def ToolBarButtonClick(self, s): print("click", s) # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = MainWindow() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()

Калькулятор дробей

import sys from PyQt5.QtWidgets import * class Window(QMainWindow): def __init__(self): super().__init__() self.setWindowTitle('Калькулятор дробей') self.initUI() def initUI(self): main_layout = QVBoxLayout() self.edit = [[0] * 3 for i in range(2)] for i in range(2): row_layout = QHBoxLayout() row_layout.addWidget(QLabel(f'Дробь {i+1}')) grid_layout = QGridLayout() for j in range(3): self.edit[i][j] = QLineEdit('') self.edit[i][j].setFixedSize(30, 30) grid_layout.addWidget(self.edit[i][0], 0, 0, 2, 1) grid_layout.addWidget(self.edit[i][1], 0, 1) grid_layout.addWidget(self.edit[i][2], 1, 1) grid = QWidget() grid.setLayout(grid_layout) row_layout.addWidget(grid) row = QWidget() row.setLayout(row_layout) main_layout.addWidget(row) bottom = QHBoxLayout() self.answer = QLabel('Результат', self) font = self.answer.font() font.setWeight(75) self.answer.setFont(font) bottom.addWidget(self.answer) from functools import partial btn_names = ('+', '-', '*', '/') for name in btn_names: btn = QPushButton(name, self) btn.setFixedSize(btn.height(), btn.height()) btn.clicked.connect(partial(self.button_clicked, name)) bottom.addWidget(btn) row = QWidget() row.setLayout(bottom) main_layout.addWidget(row) widget = QWidget() widget.setLayout(main_layout) self.setCentralWidget(widget) def button_clicked(self, oper = '+'): from fractions import Fraction value = [0, 0] try: for i in range(2): sources = [0] * 3 for j in range(3): try: sources[j] = int(self.edit[i][j].text()) except ValueError: pass denominator = sources[2] numerator = sources[0] * denominator + sources[1] value[i] = Fraction(numerator, denominator) if oper == '+': answer = value[0] + value[1] elif oper == '-': answer = value[0] - value[1] elif oper == '*': answer = value[0] * value[1] elif oper == '/': answer = value[0] / value[1] else: answer = 'ERROR' self.answer.setText(f'{answer.numerator}/{answer.denominator}') except ValueError: self.answer.setText('ERROR') except ZeroDivisionError: self.answer.setText('ERROR') # Создаем экземпляр QApplication и передаем параметры командной строки app = QApplication(sys.argv) # Создание окна приложения window = Window() window.show() # Окна скрыты по умолчанию! # Запуск цикла событий app.exec_()