Pyrym
@Pyrym
Python 3 и PyQt5

Расчёт формулы без кнопки. Программа расчёта объёма (Python 3, PyQt4)?

Разбираюсь с графической оболочкой, делаю тестовый пример.
Идея программы:
В программу пользователь вводит в формы параметры длины, ширины и высоты (a, b, h) и сразу видит в окне Расчёта вычисления объёма в виде отчёта. Пока что это я реализовал через кнопку с выводом в поле "Расчёт 2" ( self.Viv_Obl_2 = QtGui.QTextEdit() ), а надо в поле "Расчёт" ( self.Viv_Obl = QtGui.QScrollArea() ), но не разобрался с QScrollArea().
1). Я же хочу, чтобы объём рассчитывался без нажатия на кнопку, а сразу после заполнения полей a, b, h.
2). Как правильно подключить QScrollArea()?
3). Пытался запустить функцию viv(i) в теле класса Window - почему-то не работает.

b6a63b2883ee445187109aca1f37aa25.png
# Python 3. PyQt4
# -*- coding: utf-8 -*-

import sys
from PyQt4 import QtGui, QtCore

# Логика
data = []

def viv(i): # для отчёта
    i = ''.join(map(str, i))
    data.append(i)    

# Функция расчёта площади
def S(S):
    S = a*b
    i = ["S = a∙b = ",a,"∙",b," = ",S]
    viv(i)
# Функция для отчёта
def Otchet(i):
    for i in data:
        print(i)


# Графика
class Window(QtGui.QWidget): # Класс Window  наследует класс QWidget
    def __init__(self, parent=None): # Создаёт конструктор класса, parent - ссылка на родительский эл-т
        QtGui.QWidget.__init__(self, parent)
        
        self.setMinimumSize(300, 400) # Миниамльная ширина и высота окна
        self.setWindowTitle('Программа') # Заголовок
        self.setWindowIcon(QtGui.QIcon('RP\icon.png')) # Иконка 
        
        # Блок именования полей. В столбец 1
        self.a = QtGui.QLabel('Длина a =')
        self.b = QtGui.QLabel('Ширина b =')
        self.h = QtGui.QLabel('Высота h =')
        self.Viv = QtGui.QLabel('Расчёт')
        self.Viv_2 = QtGui.QLabel('Расчёт 2')
        self.Vv = QtGui.QLabel('Ввод')
        self.button1 = QtGui.QPushButton('Ввести') # Отправка сообщений программе для поля Vv
      
        # Блок создания полей. В столбец 2
        self.a_Edit = QtGui.QLineEdit()
        self.b_Edit = QtGui.QLineEdit()
        self.h_Edit = QtGui.QLineEdit()
        self.Vv_Edit = QtGui.QLineEdit() # Для ответов на вопросы программы + команды

        self.Viv_Obl = QtGui.QScrollArea() # Показывает ход вычислений
        self.Viv_Obl_2 = QtGui.QTextEdit() # Создаю компонент многострочного текста в область прокрутки
        # setWidget.Viv_Obl_2

        # Методы полей
        
        # self.a_Edit.editingFinished.connect(V)
        # self.b_Edit.editingFinished.connect(V)
        # self.h_Edit.editingFinished.connect(V)
        # self.Vv.returnPressed.connect(self.)

        # self.Viv_Obl_2.setText.connect(V)

        # Кнопка
        self.a_Edit.returnPressed.connect(self.on_click)  
        self.button1.clicked.connect(self.on_click)

        # Блок разметки
        grid = QtGui.QGridLayout() # создание сетки
        grid.setSpacing(10) # Устанавливает расстояние между компонентами

        grid.addWidget(self.a, 1, 0)
        grid.addWidget(self.a_Edit, 1, 1)
                
        grid.addWidget(self.b, 2, 0)
        grid.addWidget(self.b_Edit, 2, 1)

        grid.addWidget(self.h, 3, 0)
        grid.addWidget(self.h_Edit, 3, 1)

        grid.addWidget(self.Viv, 4, 0)
        grid.addWidget(self.Viv_Obl, 4, 1, 1, 2)

        grid.addWidget(self.Vv, 5, 0)
        grid.addWidget(self.Vv_Edit, 5, 1, 1, 1) # компонент, стр, стлб, кол  об стр, кол об стлб

        grid.addWidget(self.button1, 5, 2)

        grid.addWidget(self.Viv_2, 6, 0)
        grid.addWidget(self.Viv_Obl_2, 6, 1)
       
       
        self.setLayout(grid) # установка менеджера компоновки
        self.resize(300, 400) # шир / выс окна, работает парал. с setMinimumSize

    def on_click(self):
        a = float(self.a_Edit.text())
        b = float(self.b_Edit.text())
        h = float(self.h_Edit.text())
        V = a*b*h
        i = ["V = a∙b∙h = ",a,"∙",b,"∙",h," = ",V]
        # viv(i)
        i = ''.join(map(str, i))
        self.Viv_Obl_2.setText(str(i))
        
# Концовка       
app = QtGui.QApplication(sys.argv)

window = Window()
window.show()
sys.exit(app.exec_())
  • Вопрос задан
  • 983 просмотра
Пригласить эксперта
Ответы на вопрос 1
@deliro
На изменение любого из трёх полей вешаешь хендлер, который пытается привести три значения полей ко float и вычислить объём. Ловишь TypeError и ValueError и выводишь пустую строку.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы