Найти - Пользователи
Полная версия: PyQt4. Программа для расчёта объёма и площади
Начало » GUI » PyQt4. Программа для расчёта объёма и площади
1
Kyrym
Разбираюсь с графической оболочкой. Читаю соответственно Прохорёнка. После Лутца данный автор воспринимается проблематично. Прохорёнок почти не даёт примеров по наследованию тех или иных структур. Мой главный вопрос к форумчанам - это показать на примере моей программы, как надо правильно делать, т.е. меня интересуют не столько сами методы классов (их я в книжке вижу), сколько их непосредственное подключение.

Сразу скажу, что все ваши полезные советы однозначно буду плюсовать! )))

Что должна делать программа на первом этапе.
В программу пользователь вводит в формы параметры длины, ширины и высоты (a, b, h) и сразу видит в окне Расчёта вычисления объёма и площади.

Нижнее поле ввода и кнопка “Ввод” пока в нерабочем состоянии.

Мой первый вопрос.
Как правильно запустить функции расчёта объёма и площади с их выводом в окно Расчёта?
В комментариях к коду будут вопросы, если не сложно, поясните, пожалуйста, для чего нужны те инструкции

Текст программы
 # 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)
    print(i)
# Функция расчёта объёма
def V(V):
    V = a*b*c
    i = ["V = a•b•c = ",a,"•",b,"•",c," = ",V]
    viv(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')) # Иконка 
        # self.statusBar() - не работает
        # Блок именования полей. В столбец 1
        a = QtGui.QLabel('Длина a =')
        b = QtGui.QLabel('Ширина b =')
        h = QtGui.QLabel('Высота h =')
        Viv = QtGui.QLabel('Расчёт')
        Vv = QtGui.QLabel('Ввод')
        button1 = QtGui.QPushButton('Ввести') # Отправка сообщений программе для поля Vv
        # Блок создания полей. В столбец 2
        a_Edit = QtGui.QLineEdit()
        b_Edit = QtGui.QLineEdit()
        h_Edit = QtGui.QLineEdit()
        # Vv_Edit = QtGui.QTextEdit()
        Vv_Edit = QtGui.QLineEdit() # Для ответов на вопросы программы + команды
        Viv_Obl = QtGui.QScrollArea() # Показывает ход вычислений
        # Блок разметки
        grid = QtGui.QGridLayout() # создание сетки
        grid.setSpacing(10) # ????
        grid.addWidget(a, 1, 0)
        grid.addWidget(a_Edit, 1, 1)
                
        grid.addWidget(b, 2, 0)
        grid.addWidget(b_Edit, 2, 1)
        grid.addWidget(h, 3, 0)
        grid.addWidget(h_Edit, 3, 1)
        grid.addWidget(Viv, 4, 0)
        grid.addWidget(Viv_Obl, 4, 1, 1, 2)
        grid.addWidget(Vv, 5, 0)
        grid.addWidget(Vv_Edit, 5, 1, 1, 1) # компонент, стр, стлб, кол стр, кол стлб
        grid.addWidget(button1, 5, 2)
       
       
        self.setLayout(grid) # ????
        self.resize(150, 100) # ????
# Концовка       
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
vic57
лучше почитай http://doc.crossplatform.ru/qt/4.8.x/html-qt/
привязка почти 100%, там поймешь основы. прохоренок - сборник рецептов
 #!/usr/bin/env python
#-*-coding:utf-8-*-
from PyQt4.Qt import *
class Widget(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.edit1 = QLineEdit()
        self.edit2 = QLineEdit()
        self.lbl = QLabel()
        self.btn = QPushButton("Calc")
        self.lay = QVBoxLayout(self)
        self.lay.addWidget(self.edit1)
        self.lay.addWidget(self.edit2)
        self.lay.addWidget(self.lbl)
        self.lay.addWidget(self.btn)
        self.edit2.returnPressed.connect(self.on_click)
        self.btn.clicked.connect(self.on_click)
    def on_click(self):
        self.lbl.setText('Value: '+str(float(self.edit1.text())*float(self.edit2.text())))
if __name__=="__main__":
    app = QApplication([])
    w = Widget()
    w.move(0,0)
    w.resize(400,100)
    w.show()
    app.exec_()
Rodegast
Я знаю что всем … но всё-таки:
1) http://welinux.ru/post/7471/
2) Не наследуйся от QWidget
Kyrym
Rodegast
1) http://welinux.ru/post/7471/
Я пока код ручками пишу, а так про это знаю.
Rodegast
2) Не наследуйся от QWidget
Почему не надо наследоваться от QWidget?

vic57, спасибо! Изучаю.
Rodegast
> Я пока код ручками пишу, а так про это знаю.

Ну если знаешь, то почему “ручками”?

> Почему не надо наследоваться от QWidget?

Потому что оконный менеджер ничего не будет знать о типе окна и следовательно его поведение может быть не правильным.
Kyrym
Rodegast
Ну если знаешь, то почему “ручками”?
Потому что так я учусь коду.
Rodegast
Потому что оконный менеджер ничего не будет знать о типе окна и следовательно его поведение может быть не правильным.
Я так ничего и не понял. Программы на QWidget работают. В обучениях про этот класс пишут. О типе окна в данном классе говорит параметр flags или аналогичный метод. Я их, правда, не пробовал, но и надобности не было. Наверное, пойму Вашу мысль, на своём опыте.

Так-с… С кнопкой у меня получилось запустить расчёт формулы - посчитать объём. Результат выводится в многострочное поле “Расчёт 2” (см. код 1).

Мои новые вопросы:
1. Пробовал засунуть функцию viv(i) в класс Window. На эту функцию идёт ссылка из функции def on_click(self). Но почему-то viv(i) не срабатывает (см. код 2).
2. Не пойму, как запустить расчёт без кнопки. Т.е. я начинаю заполнять поля a, b, h, а объём сразу начинает рассчитываться.
Для однострочного текста я нашёл метод “editingFinished” - я так понимаю, передача сигнала должна начинаться после ввода числа в поле и перехода в другое поле.
Как-то так:
 self.a_Edit.editingFinished.connect(self.on_click2)
self.b_Edit.editingFinished.connect(self.on_click2)
self.h_Edit.editingFinished.connect(self.on_click2)
А что дальше?

Код 1
 # 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')) # Иконка 
        # self.statusBar() - не работает
        # Блок именования полей. В столбец 1
        self.a = QtGui.QLabel('Длина a =')
        self.b = QtGui.QLabel('Ширина b =')
        self.h = QtGui.QLabel('Высота h =')
        self.Viv = QtGui.QLabel('Расчёт')
        self.Vv = QtGui.QLabel('Ввод')
        self.button1 = QtGui.QPushButton('Ввести') # Отправка сообщений программе для поля Vv
        self.Viv_2 = QtGui.QLabel('Расчёт 2')
        # Блок создания полей. В столбец 2
        self.a_Edit = QtGui.QLineEdit()
        self.b_Edit = QtGui.QLineEdit()
        self.h_Edit = QtGui.QLineEdit()
        # self.Vv_Edit = QtGui.QTextEdit()
        self.Vv_Edit = QtGui.QLineEdit() # Для ответов на вопросы программы + команды
        self.Viv_Obl = QtGui.QScrollArea() # Показывает ход вычислений
        self.Viv_Obl_2 = QtGui.QTextEdit() # Создаю компонент многострочного текста в область прокрутки
        '''setWidget.Viv_Obl_2'''
        # Расширение свойств полей
          # Варианты значений
        '''arr = [25,28,30,48]
        completer = QtGui.QCompleter(arr, window)
        b_Edit.setCompleter(completer)'''
        '''self.Viv_Obl_2.setText('sss')'''
        # Методы полей
        '''self.Viv_Obl_2.setText('sss'+'+dd=')'''
        
        # 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(150, 100) # ????
    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))
        # self.Viv_Obl_2.setText('Итог: '+str(float(self.a_Edit.text()))) # работает
# Концовка       
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

Код 2
 # Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
# Логика
data = []
# Функция расчёта площади
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')) # Иконка 
        # self.statusBar() - не работает
        # Блок именования полей. В столбец 1
        self.a = QtGui.QLabel('Длина a =')
        self.b = QtGui.QLabel('Ширина b =')
        self.h = QtGui.QLabel('Высота h =')
        self.Viv = QtGui.QLabel('Расчёт')
        self.Vv = QtGui.QLabel('Ввод')
        self.button1 = QtGui.QPushButton('Ввести') # Отправка сообщений программе для поля Vv
        self.Viv_2 = QtGui.QLabel('Расчёт 2')
        # Блок создания полей. В столбец 2
        self.a_Edit = QtGui.QLineEdit()
        self.b_Edit = QtGui.QLineEdit()
        self.h_Edit = QtGui.QLineEdit()
        # self.Vv_Edit = QtGui.QTextEdit()
        self.Vv_Edit = QtGui.QLineEdit() # Для ответов на вопросы программы + команды
        self.Viv_Obl = QtGui.QScrollArea() # Показывает ход вычислений
        self.Viv_Obl_2 = QtGui.QTextEdit() # Создаю компонент многострочного текста в область прокрутки
        '''setWidget.Viv_Obl_2'''
        # Расширение свойств полей
          # Варианты значений
        '''arr = [25,28,30,48]
        completer = QtGui.QCompleter(arr, window)
        b_Edit.setCompleter(completer)'''
        '''self.Viv_Obl_2.setText('sss')'''
        # Методы полей
        '''self.Viv_Obl_2.setText('sss'+'+dd=')'''
        
        # 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(150, 100) # ????
    def viv(i): # для отчёта
        i = ''.join(map(str, i))
        data.append(i)
    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)
        self.Viv_Obl_2.setText(str(i))
        
# Концовка       
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB