Верстаем интерфейс
Давайте теперь попробуем что-нибудь считать. Сделаем такой мини калькулятор. У которого будет два числа для ввода и возможность сложить их.
Создадим новый проект. Добавим в него пока пустой файлик main.py
.
Переключим версию питона на miniconda
далее нам надо выбрать именно установленный нами python, для этого тыкаем внизу, и в появившемся списке выбираем нужную нам версию
Теперь давайте запустим pyside6-designer. Тыкаем Ctrl+Shift+P
и находим там Python: Создать терминал
снизу откроется консолька, пишем в ней pyside6-designer
и жмем enter
в дизайнере тыкаем создать
добавляем два поля для ввода и кнопку
Я хочу выводить ответ прямо на форму. Для этого элемент который называется Label (по-русски: метка, ярлычок, подпись)
давайте теперь всем элементам дадим имена:
- первое поле для ввода будет txtA
- второе поле для ввода будет txtB
- кнопку назовем btnAdd
- метку для ответа назовем lblAnswer
напоминаю, что, чтобы присвоить элементу имя, надо выбрать его, и справа внизу прописать свойство objectName
Правим верстку
Теперь немного выровняем элементы. Для этого есть такой прием, удерживая Ctrl кликнем последовательно сначала на поля для ввода, а затем на кнопку, вот так:
теперь сверху нажмем на кнопочку с тремя полосками в ряд:
отлично, теперь они стоят ровно. А вот эта красная рамочка вокруг элементов она просто для удобства редактирования и при работе приложения не будет видна.
Если вы хотите обратно раскидать элементы в произвольном порядке, то тыкнете кнопку с красным значком
но я верну обратно
теперь можно кликнуть где-нибудь в середине формы и нажать еще одну кнопочку:
чтобы элементы не растягивались на всю высоту, мы можем добавить специальный элемент, который сработает следующим образом
то есть он как бы заполняет собой пустое пространство, а остальные элементы сжимает, чтобы они занимали столько места сколько им надо.
С этим можно поиграться если хочется достичь ровной-резиновой верстки, но если вам привычнее работать располагая элементы вручную можете снова нажать на кнопочку с красным кругляшом:
давайте поменяем текст на кнопке (кликнем на нее два раза):
и чтобы ответ выглядел получше, увеличу шрифт у lblAnswer
Отлично! =) Сохраняем наш результат в папку с проектом под именем MainWindow.ui
проверяем что он появился в Visual Studio Code
Если он там есть, значит все хорошо. Закрываем редактор интерфейсов.
Создаем болванку приложения
И так, у нас есть файл с интерфейсом, сгенерируем по нему python файл, открываем консольку и пишем в ней:
pyside6-uic MainWindow.ui -o mainwindow.py
у нас должен появится файлик mainwindow.py
теперь загоняем в 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())
попробуем запустить,
если форма появилась и выглядит примерно, как у меня, значит все ок =)
Считываем числа с полей для ввода
Давайте теперь добавим обработчик события клика на кнопку
# ...
class MainWindow(QMainWindow):
def __init__(self):
super(MainWindow, self).__init__()
self.ui = Ui_MainWindow()
self.ui.setupUi(self)
# привязал к событию клика функцию on_btnAdd_clicked
self.ui.btnAdd.clicked.connect(self.on_btnAdd_clicked)
# собственно сама функция
def on_btnAdd_clicked(self):
print("Сложил")
# ...
проверим как оно работает:
отлично, теперь давайте считаем значения с полей, это мы уже делали, правим функцию on_btnAdd_clicked
def on_btnAdd_clicked(self):
a = self.ui.txtA.text()
b = self.ui.txtB.text()
print("Сложил")
попробуем их сложить:
def on_btnAdd_clicked(self):
a = self.ui.txtA.text()
b = self.ui.txtB.text()
print(a + b)
то есть оно складывает, но проблема та же что и когда мы работали с пользователем через input
. Он не складывает, а склеивает строки. Чтобы решить проблему воспользуемся тем же способом что и использовали при работе с input. Преобразуем в числа с помощью int
, вот так:
def on_btnAdd_clicked(self):
a = int(self.ui.txtA.text())
b = int(self.ui.txtB.text())
print(a + b)
тестируем:
вот теперь другое дело =)
Выводим ответ прямо на форму
Кстати помните мы ж добавляли Label (метку) и даже шрифт ей меняли чтобы выводить в нее ответ. Так давайте ей воспользуемся.
Вывести ответ на форму очень просто, надо вместо функции print воспользоваться функцией setText привязанной к компоненте. Делается это так:
def on_btnAdd_clicked(self):
a = int(self.ui.txtA.text())
b = int(self.ui.txtB.text())
self.ui.lblAnswer.setText(f"Сумма: {a + b}")
тестируем:
в принципе и все.
Единственное на что еще важно обратить внимание, что в setText обязательно надо передавать текст. То есть если a и b это числа, то нельзя просто написать
self.ui.lblAnswer.setText(a + b)
надо обязательно превращать числа обратно в строки либо так
self.ui.lblAnswer.setText(str(a + b))
либо так
self.ui.lblAnswer.setText(f"{a + b}")
ну либо формировать фразу как мы делали выше.
Вот теперь можно пилить задание =)
Задание
Доработать приложение из подсказки, добавить кнопки для расчета разности, частного и произведения. При делении на ноль выводить какое-нибудь сообщение
чтобы вывести цветное сообщение вы можете использовать html теги. Например так:
self.ui.lblAnswer.setText(f"<b style='color: red'>На ноль делить нельзя</b>")