Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Диалог с программой через кнопку [RSS Feed]

#1 Янв. 20, 2017 10:58:09

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

Нажав на кнопку “Расчёт” программа выводит в текстовое поле перечень вариантов расчёта.
Далее пользователь в поле ввода пишет нужный вариант (1 или другую цифру) и нажимает на кнопку “Ввести”. После чего программа должна взять число пользователя в функцию обработчика “on_click” и продолжить его работу.
Я не понимаю, как совместить работу двух обрабочиков “on_click” и “on_click_Vvod”.
Подскажите, пожалуйста!

 # Python 3. PyQt4
# -*- coding: utf-8 -*-
import sys
from PyQt4 import QtGui, QtCore
# Графика
class Window(QtGui.QWidget): # Класс Window  наследует класс QWidget
    def __init__(self, parent=None): # Создаёт конструктор класса, parent - ссылка на родительский эл-т
        QtGui.QWidget.__init__(self, parent)
        
        self.resize(300, 300) # шир / выс окна
        
        # Блок именования полей. В столбец 1
        self.lbl_Console = QtGui.QLabel('Расчёт')        
        self.lbl_Vvod = QtGui.QLabel('Ввод')
        self.button_1 = QtGui.QPushButton('Ввести') # Отправка сообщений программе для поля Vv
        self.button_2 = QtGui.QPushButton('Расчёт') # Запуск расчёта
      
        # Блок создания полей. В столбец 2
        self.Pole_Console = QtGui.QTextEdit() # Показывает ход вычислений        
        self.Pole_Vvod = QtGui.QLineEdit() # Для ответов на вопросы программы + команды
        # Кнопка
        self.button_2.clicked.connect(self.on_click)
        
        self.Pole_Vvod.returnPressed.connect(self.on_click_Vvod)  
        self.button_1.clicked.connect(self.on_click_Vvod)
        # Блок разметки
        grid = QtGui.QGridLayout() # создание сетки
        grid.setSpacing(10) # Устанавливает расстояние между компонентами
        grid.addWidget(self.lbl_Console, 1, 0)
        grid.addWidget(self.Pole_Console, 1, 1, 1, 2)
        grid.addWidget(self.button_2, 0, 2)
        grid.addWidget(self.lbl_Vvod, 2, 0)
        grid.addWidget(self.Pole_Vvod, 2, 1, 1, 1) # компонент, стр, стлб, кол  об стр, кол об стлб
        grid.addWidget(self.button_1, 2, 2)
           
        self.setLayout(grid) # установка менеджера компоновки
    def on_click(self):
        def cnsl(i):
            self.Pole_Console.setText(i)           
            
        cnsl('''Выбрать вариант:
1. расчёт объёма
2. расчёт площади''')
        vvod = int(self.Pole_Vvod.text())
        if vvod == 1:
            cnsl('выбран расчёт объёма')
        else: cnsl('выбран расчёт площади')
    def on_click_Vvod(self):
        self.Pole_Console.append(self.Pole_Vvod.text())       
       
# Концовка
app = QtGui.QApplication(sys.argv)
window = Window()
window.show()
sys.exit(app.exec_())

Офлайн

#2 Янв. 20, 2017 16:31:58

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

имхо “ввести” у тебя лишнее
QLineEdit.returnPressed вполне достаточно
но можешь вызвать из одного обработчика другой

     def on_click_Vvod(self):
        self.on_click()

Офлайн

#3 Янв. 20, 2017 21:49:34

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

vic57
имхо “ввести” у тебя лишнее QLineEdit.returnPressed вполне достаточно можешь вызвать из одного обработчика другой
В смысле кнопка “ввести” лишняя? Но так не получится. Когда функция on_click() запущена, то в поле Pole_Vvod ещё нет числа, поэтому и возвращать из Pole_Vvod в on_click() с помощью QLineEdit.returnPressed нечего.
Думаю, надо пояснить: on_click() - это основное “тело функции”, в котором выполняются расчёты и диалоги. Получается что после вывода программой пользователю вариантов дальнейшего хода вычислений, выполнение on_click() должно встать на паузу и ожидать ввода пользователем своего выбора, после чего пауза с on_click() снимается и выполнение функции продолжается.
Поскольку у программы будет не один вопрос, то on_click_Vvod - функция многократного применения.

 def on_click_Vvod(self):
        self.on_click()
Данный код запустит on_click() сначала. Получим замкнутый цикл без продолжения.
Похоже выходом является создание некой вереницы, где on_click() будет разбит на n-функций, разбитых ф-цией on_click_Vvod. Буду тестить вариант.

Офлайн

#4 Янв. 21, 2017 09:30:38

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

как-то у тебя все сложно
алгоритм:
1. выбор типа расчета (QComboBox)
2. ввод данных (QLineEdit)
3. расчет и вывод результата (QPlainTextEdit)

 # -*- coding:utf-8 -*-
from PyQt4.Qt import *
class View(QWidget):
    def __init__(self):
        QWidget.__init__(self)
        self.box = QComboBox()
        self.plain = QPlainTextEdit()
        self.edit = QLineEdit()
        self.lay = QVBoxLayout(self)
        self.lay.addWidget(self.box)
        self.lay.addWidget(self.plain)
        self.lay.addWidget(self.edit)
        self.edit.setEnabled(False)
        self.box.addItems([u'Выбор',u'Площадь круга', u'Площадь прямоугольника'])
        self.box.currentIndexChanged.connect(self.on_box)
        self.edit.returnPressed.connect(self.on_edit)
    def on_box(self,index):
        if not index:
            self.edit.clear()
            self.edit.setPlaceholderText('')
            self.edit.setEnabled(False)
            self.plain.clear()
        elif index == 1:
            self.edit.setEnabled(True)
            self.edit.clear()
            self.edit.setPlaceholderText(u'Введите радиус и нажмите Enter')
        elif index == 2:
            self.edit.setEnabled(True)
            self.edit.clear()
            self.edit.setPlaceholderText(u'Введите X,Y и нажмите Enter')
    def on_edit(self):
        index = self.box.currentIndex()
        lst = str(self.edit.text()).split(',')
        arr = [float(i) for i in lst]
        if index == 1:
            result = 2*3.1415*arr[0]
            self.plain.insertPlainText('R='+ lst[0]+'\n')
            self.plain.insertPlainText(u'Площадь круга: '+ str(result)+'\n')
        elif index == 2:
            result = arr[0]*arr[1]
            self.plain.insertPlainText('X='+ lst[0] +'  Y=' + lst[1]+ '\n')
            self.plain.insertPlainText(u'Площадь прямоугольника: '+ str(result)+'\n')
            
if __name__ == "__main__":
    app = QApplication([])
    v = View()
    v.resize(400,300)
    v.move(0,0)
    v.show()
    app.exec_()

Отредактировано vic57 (Янв. 21, 2017 10:36:47)

Офлайн

#5 Янв. 23, 2017 07:40:24

Kyrym
Зарегистрирован: 2016-12-28
Сообщения: 225
Репутация: +  3  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

vic57
алгоритм:
1. выбор типа расчета (QComboBox)
2. ввод данных (QLineEdit)
3. расчет и вывод результата (QPlainTextEdit)
Мне было очень интересно посмотреть на эту программу. Теперь я знаю, как работает ComboBox, за что большое спасибо!
Должен заметить, что 2*Пи*R - это длина дуги. Площадь круга: Пи * R^2.
Представленный алгоритм, к сожалению, не решает мою задачу - нужный мне диалог с программой отсутствует. Сейчас буду воплощать свои пятничные мысли.

Кстати, а что значит буква “u”: “…PlainText(u'Площадь…”? Мне приходится стирать все u, иначе Shell пишет ошибку.

Офлайн

#6 Янв. 24, 2017 17:48:13

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

'u' - unicode python-2.7

Офлайн

#7 Янв. 24, 2017 17:49:15

vic57
Зарегистрирован: 2015-07-07
Сообщения: 893
Репутация: +  126  -
Профиль   Отправить e-mail  

Диалог с программой через кнопку

Kyrym
Должен заметить, что 2*Пи*R - это длина дуги. Площадь круга: Пи * R^2.
ну да , обшибся
+ в репу

Отредактировано vic57 (Янв. 24, 2017 17:54:27)

Офлайн

  • Начало
  • » GUI
  • » Диалог с программой через кнопку[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version