Разбираюсь с графической оболочкой, делаю тестовый пример.
Идея программы:
В программу пользователь вводит в формы параметры длины, ширины и высоты (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 - почему-то не работает.
# 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_())