Форум сайта python.su
Разбираюсь с графической оболочкой. Читаю соответственно Прохорёнка. После Лутца данный автор воспринимается проблематично. Прохорёнок почти не даёт примеров по наследованию тех или иных структур. Мой главный вопрос к форумчанам - это показать на примере моей программы, как надо правильно делать, т.е. меня интересуют не столько сами методы классов (их я в книжке вижу), сколько их непосредственное подключение.
Сразу скажу, что все ваши полезные советы однозначно буду плюсовать! )))
Что должна делать программа на первом этапе.
В программу пользователь вводит в формы параметры длины, ширины и высоты (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_())
Отредактировано Kyrym (Янв. 13, 2017 15:40:57)
Офлайн
лучше почитай 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_()
Отредактировано vic57 (Янв. 13, 2017 16:10:08)
Офлайн
Я знаю что всем … но всё-таки:
1) http://welinux.ru/post/7471/
2) Не наследуйся от QWidget
Офлайн
RodegastЯ пока код ручками пишу, а так про это знаю.
1) http://welinux.ru/post/7471/
RodegastПочему не надо наследоваться от QWidget?
2) Не наследуйся от QWidget
Офлайн
> Я пока код ручками пишу, а так про это знаю.
Ну если знаешь, то почему “ручками”?
> Почему не надо наследоваться от QWidget?
Потому что оконный менеджер ничего не будет знать о типе окна и следовательно его поведение может быть не правильным.
Офлайн
RodegastПотому что так я учусь коду.
Ну если знаешь, то почему “ручками”?
RodegastЯ так ничего и не понял. Программы на QWidget работают. В обучениях про этот класс пишут. О типе окна в данном классе говорит параметр flags или аналогичный метод. Я их, правда, не пробовал, но и надобности не было. Наверное, пойму Вашу мысль, на своём опыте.
Потому что оконный менеджер ничего не будет знать о типе окна и следовательно его поведение может быть не правильным.
self.a_Edit.editingFinished.connect(self.on_click2) self.b_Edit.editingFinished.connect(self.on_click2) self.h_Edit.editingFinished.connect(self.on_click2)
# 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_())
# 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_())
Отредактировано Kyrym (Янв. 17, 2017 08:44:26)
Офлайн