Создаем проект
Вот мы в прошлых заданиях использовали кнопочку, чтобы посчитать результат.
Но на самом деле есть возможность рассчитывать значения прямо на лету. Для этого можно привязывать функции не к событию клика, а к событию изменения текста в полях для ввода.
Попробуем набросать приложение для расчета квадратных корней, а вы потом уже доделаете его до конца сами.
И так, как обычно, создаем новый проект с файликом main.py
сразу загоним в него болванку python кода
import sys
import os
import PySide6
from PySide6.QtWidgets import QApplication, QMainWindow
from mainwindow import Ui_MainWindow
dirname = os.path.dirname(PySide6.__file__)
plugin_path = os.path.join(dirname, 'plugins', 'platforms')
os.environ['QT_QPA_PLATFORM_PLUGIN_PATH'] = plugin_path
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec())
Верстаем интерфейс
Запустим pyside6-designer. Как обычно тыкаем Ctrl+Shift+P
и находим там Python: Создать терминал
и вводим pyside6-designer
тыкаем создать
добавим на форму три поля для ввода и четыре метки
кстати у меток можно менять текст если на них два раза тыкнуть. Я верхние три буду использовать просто чтобы подписать что вводить в поля для ввода. Ну помним же квадратное уравнение:
собственно, первое поле ввода под a
, второе под b
, третье под c
давайте теперь дадим имена полям и нижней метке в которую мы будем писать ответ
напоминаю, что имя мы указываем кликая на элемент и прописывая свойство objectName
:
давайте теперь все выровняем:
увеличим шрифт у метки для ответа
и отцентрируем ее (для этого надо ее растянуть и поставить свойство alignment):
и чтобы текст на метке ответа не смущал пользователя, просто удалим его:
сохраняем файлик и называем его как обычно MainWindow.ui
проверяем что файлик появился в Visual Studio Code
и если все ок, то закрываем дизайнер
Добавляем реакцию на изменение текста в полях для ввода
Скомпилируем интерфейс в питон файл
pyside6-uic MainWindow.ui -o mainwindow.py
теперь давайте попробуем реализовать какой-нибудь простой расчет типа сложить три числа.
Добавим функцию расчета
# ...
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# добавил функцию расчета
def compute(self):
a = int(self.ui.txtA.text())
b = int(self.ui.txtB.text())
c = int(self.ui.txtC.text())
self.ui.lblAnswer.setText(f"{a + b + c}")
# ...
попробуем запустить
пока никакой реакции нет, но оно и понятно. Не смотря на то что мы добавили функцию, сам расчет то ни откуда не запускается, так как кнопки то нет.
Оказывается, расчет можно запускать по событию изменения текста в полях для ввода, делается это так:
# ...
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# добавил реакцию на событие изменения текста
self.ui.txtA.textChanged.connect(self.compute)
# ...
тестируем:
то есть получается если мы меняем текст в первом поле для ввода, то программа, при условии, что в остальных полях тоже есть числа, начинает считать.
Мы можем привязать эту функцию расчёта ко оставшимся двум полям:
# ...
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
self.ui.txtA.textChanged.connect(self.compute)
# добавил реакцию оставшимся полям
self.ui.txtB.textChanged.connect(self.compute)
self.ui.txtC.textChanged.connect(self.compute)
# ...
проверяем:
Красота! =)
То есть теперь мы можем реализовывать любой достаточно сложный расчет внутри функции compute.
Думаю, идея ясна, попробуйте сделать задание =О
Задание
Создать приложение, которое сможет рассчитать корни квадратного уравнения
чтобы вывести x с индексом можно использовать html тег sub
, вот так:
self.ui.lblAnswer.setText(f"x<sub>1</sub> = {x1}<br>x<sub>2</sub> = {x2}")
<br>
- сделает перенос на новую строку