Как из QLineEdit получить значение integer? PyQt5
Суть вопроса в заголовке. При получении при помощи .text или .toPlainText , и попытке переделать его в integer при помощи int(variable) , UI крашится.
Отслеживать
77.2k 6 6 золотых знаков 58 58 серебряных знаков 126 126 бронзовых знаков
задан 24 окт 2018 в 10:19
AgeofCreations AgeofCreations
71 1 1 серебряный знак 11 11 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
У QLineEdit есть только .text() , а .toPlainText() это к QTextEdit и QPlainTextEdit .
Кроме того, если в int(. ) будет передано, что-то отличное от числового значения, будет исключение, которое если не ловить, сломает приложение.
Пример (Замените ‘123’ , например на ‘123,’ и получите ошибку):
from PyQt5.Qt import QLineEdit, QApplication app = QApplication([]) line_edit = QLineEdit('123') value = line_edit.text() print(value) # "123" print(int(value)) # 123
PS. Чтобы поймать исключение в слотах Qt, добавьте код:
def log_uncaught_exceptions(ex_cls, ex, tb): text = '<>: <>:\n'.format(ex_cls.__name__, ex) import traceback text += ''.join(traceback.format_tb(tb)) print(text) QMessageBox.critical(None, 'Error', text) quit() import sys sys.excepthook = log_uncaught_exceptions
PPS. а зачем вам QLineEdit ? Может быть, лучше использовать QSpinBox ? У QSpinBox есть метод .value() которое вернет int
PPPS. добавлю пример проверки значения строки при конвертации в число:
from PyQt5.QtWidgets import QWidget, QApplication, QLineEdit, QPushButton, QVBoxLayout, QMessageBox class Window(QWidget): def __init__(self): super().__init__() self.line_edit = QLineEdit('123') self.button_check = QPushButton('Проверить число!') self.button_check.clicked.connect(self._on_check) layout = QVBoxLayout() layout.addWidget(self.line_edit) layout.addWidget(self.button_check) self.setLayout(layout) def _on_check(self): text = self.line_edit.text() try: value = int(text) QMessageBox.information(self, 'Информация', 'Введено число: "<>"'.format(value)) except ValueError: QMessageBox.warning(self, 'Внимание', 'Введено невалидное число: "<>"'.format(text)) if __name__ == '__main__': app = QApplication([]) mw = Window() mw.show() app.exec()
Как получить значение lineEdit при вызове функции из модуля?
Здравствуйте, я начинаю изучать Python и PyQt и у меня появился вопрос насчёт вызова функции из модуля и работы с объектами PyQt. Есть 3 файла. Мне нужно получить значение из lineEdit в функции Second.py, а затем вызвать эту функцию в First.py. НО значение в lineEdit задаётся внутри First.py. lineEdit изначально создан в файле design.py
Ниже приведён упрощённый код:
# -*- coding: utf-8 -*- # Form implementation generated from reading ui file 'design.ui' # # Created by: PyQt5 UI code generator 5.13.2 # # WARNING! All changes made in this file will be lost! from PyQt5 import QtCore, QtGui, QtWidgets class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") MainWindow.resize(800, 600) self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.lineEdit = QtWidgets.QLineEdit(self.centralwidget) self.lineEdit.setGeometry(QtCore.QRect(230, 190, 113, 20)) self.lineEdit.setObjectName("lineEdit") self.pushButton = QtWidgets.QPushButton(self.centralwidget) self.pushButton.setGeometry(QtCore.QRect(370, 190, 75, 23)) self.pushButton.setObjectName("pushButton") MainWindow.setCentralWidget(self.centralwidget) self.menubar = QtWidgets.QMenuBar(MainWindow) self.menubar.setGeometry(QtCore.QRect(0, 0, 800, 21)) self.menubar.setObjectName("menubar") MainWindow.setMenuBar(self.menubar) self.statusbar = QtWidgets.QStatusBar(MainWindow) self.statusbar.setObjectName("statusbar") MainWindow.setStatusBar(self.statusbar) self.retranslateUi(MainWindow) QtCore.QMetaObject.connectSlotsByName(MainWindow) def retranslateUi(self, MainWindow): _translate = QtCore.QCoreApplication.translate MainWindow.setWindowTitle(_translate("MainWindow", "MainWindow")) self.pushButton.setText(_translate("MainWindow", "PushButton"))
import sys from PyQt5 import QtWidgets from PyQt5.QtWidgets import * import design from Second import Hax class App(QtWidgets.QMainWindow, design.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) self.lineEdit.setText("22") self.pushButton.clicked.connect(self.Test) def Test(self): Hax().calc() def main(): App = QtWidgets.QApplication([]) window = App() window.show() app.exec_() if __name__ == '__main__': app = QApplication(sys.argv) window = App() window.show() sys.exit(app.exec_())
from PyQt5 import QtWidgets import design class Hax(QtWidgets.QMainWindow, design.Ui_MainWindow): def __init__(self): super().__init__() self.setupUi(self) def calc(self): print(self.lineEdit.text()) print("Текст?")
- Вопрос задан более двух лет назад
- 259 просмотров
Как переменной присвоить значения введённые в QLineEdit?
Есть у меня окно, там есть QLineEdit. Я хочу чтобы по нажатию клавиши Enter, или кнопки под QLineEdit, значения из QLineEdit, например ‘56’, присваивались какой-то переменной. Далее с переменой происходили какие-то манипуляции, например ‘a = a+10’, и результат выводился в окно, выше QLineEdit.
Вот моё окно:
#!/usr/bin/python3 # -*- coding: utf-8 -*- import sys from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QApplication) class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): qle = QLineEdit(self) qle.move(60, 100) self.lbl.move(60, 40) self.setGeometry(300, 300, 280, 170) self.setWindowTitle('QLineEdit') self.show() if __name__ == '__main__': app = QApplication(sys.argv) ex = Example() sys.exit(app.exec_())
Я знаю что сигнал от кнопки Enter можно получить таким кодом
def keyPressEvent(self, e): if e.key() == Qt.Key_Enter: #Что здесь делать дальше я не знаю
- Вопрос задан более трёх лет назад
- 5100 просмотров
Комментировать
Решения вопроса 1
☺Нужен VPS? Два месяца бесплатно. Смотри профиль☺
a = self.qle.text()
Ответ написан более трёх лет назад
Имя Фамилия @FedkaOfficial Автор вопроса
А как вывести значение в окно?
Фёдор Заплатин: гуглите QLabel setText python
Ответы на вопрос 1
Sergey6661313 @Sergey6661313
#!/usr/bin/python3 # -*- coding: utf-8 -*- # вообще достаточно просто преобразовывать текст в число и работать с ним: def prostoe_preobrazovanie_texta_v_chislo(text): try: # а вдруг там не число, а хрен пойми что? chislo = int(text) # собственно вот нужная нам строчка. return chislo except Exception: return False # но иногда приходится выковыривать число из текста: def slojnoe_raspoznovanie_chisla(text): try: # а вдруг там число всё же где то есть? import re chislo = int(re.findall('(\d+)', text)[0]) # магия! return chislo except Exception: return False # ну и конечно обратное действие: def preobrazovanie_chisla_v_text(i): return str(i) # вообще для чисел был специально придуман QSpinBox и QDoubleSpinBox # но отвечая на Ваш вопрос мы всё же сделаем и вариант с QLineEdit from PyQt5.QtWidgets import (QWidget, QLabel, QLineEdit, QApplication, QPushButton, QBoxLayout, QDoubleSpinBox) from PyQt5.Qt import Qt class Example(QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): layout = QBoxLayout(QBoxLayout.Down, self) # - это для компоновки self.qle = QLineEdit("", self) # почему lbl в локальной видимости а qle нет? # self - тут очень важно иначе как вы будете обращятся к своему qle? self.qle.setPlaceholderText("Например: 56") # - самая крутая killer фича. layout.addWidget(self.qle) # - ну и отдаём его компоновщику. button = QPushButton("математика!") # - вы же хотели ещё и кнопку да? button.pressed.connect(self.my_super_puper_function) # вот так соединяем нажатие с методом layout.addWidget(button) # - уж попроще всяких button.move(60, 40) self.spinbox = QDoubleSpinBox() # - пример виджета который изначально под это заточен self.spinbox.setRange(0, 99999999) # к сожелению по умолчанию там стоят жёсткие ограничения layout.addWidget(self.spinbox) self.lbl = QLabel("\n\n\n") # - это ведь label - я угадал? layout.addWidget(self.lbl) self.setWindowTitle('Простой пример') self.show() def keyPressEvent(self, e): if e.key() == Qt.Key_Enter: self.my_super_puper_function() # а что мешало прямо тут реализовывать математику? # ну мы же ещё и кнопку хотим подключить на то же самое. def my_super_puper_function(self): # та самя функция. # в большинстве случаев математика не работает потому что в qlineedit изначально распологаются не числа, # а текст. Ну и как вы к "абвгд" прибавите 10 ? # никак. сначало нам нужно убедится что там действительно число: i = self.proverki_na_chislo() # вообщемто просто: я вынес всю магию в отдельный метод. # и этот метод возвращяет число именно числом а не текстом. if i: # если там вообще число, тогда: self.matematika(i) # математику в студию! def matematika(self, a): # я думаю в комментариях не нуждается. b = a * 7 * 1443 # моя любимая математика: она утраивает двухзначное число :) # со spinbox-м просто: self.spinbox.setValue(b / 11111 * 12345 / 54321 * 5) # будет работать, я гарантирую. # а вот для qlineedit тяжелее: b_text = preobrazovanie_chisla_v_text(b) # число нужно сначало сделать текстом. self.qle.setText(b_text) # и лишь потом выводить. # ну и всякие смехуёчки. куда же без них? if b < 10**10: self.lbl.setText("Конкретная математика - для реальныйх пацанов!") else: self.lbl.setText("ОЛОЛОЛО. ") # а этом вообщем то следовало бы остановится. # но мой qt вылетает без предупреждений если в lineEdit вписать хоть одну букву. # и тут меня понесло: def proverki_na_chislo(self): text = self.qle.text() if text != "": # если наше поле не пустое i = prostoe_preobrazovanie_texta_v_chislo(text) # пробуем простое преобразование if i: # ну и если удечно: return i # выходим из этой функции уже с числом. i = slojnoe_raspoznovanie_chisla(text) # а если так и не вышли то пробуем более сложное. if i: self.lbl.setText(text + " - разве это число?\n" + "тут конечно есть число: " + str(i) + "\nно я с ним ничего решать не буду!") return i self.lbl.setText("Пожалуйста не материтесь. ") # в противном случае скорее всего число вообще не написано: return False else: self.lbl.setText("нужно вписать число!") return False if __name__ == '__main__': import sys app = QApplication(sys.argv) ex = Example() ex.show() sys.exit(app.exec_()) # без этого ничего не запустится. # как то-так. ну вы держитесь там. Всего вам доброго!
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ
- Python
- +2 ещё
Как реализовать изменение данных анкеты в БД через inline клавиатуру в телеграм боте?
- 1 подписчик
- 4 минуты назад
- 6 просмотров
Как считать значение с lineEdit
Мне надо сделать оператор для деления двух больших чисел с заданным количеством после запятой, как мне передать это количество в оператор?
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Считать значение из lineedit
Вопрос для новичка.Как в qt можно считать значение из lineedit и передать его в функцию,как.
Как с lineedit считать данные в char?
Проблема такая: есть окошко lineedit, в которую пользователь вводит число и мне его надо считать.
Считать данные в массив с lineEdit
Всем привет. Прошу помощи в вопросе. Как считать данные в массив с lineEdit? Спасибо.:) .
Как считать функцию с lineEdit, чтобы можно было передать ей х?
Надо введённую функцию подставить в def1, выдает ошибку при таком коде.Помогите def F1(x): .
5534 / 4298 / 1217
Регистрация: 12.10.2013
Сообщений: 12,332
Записей в блоге: 2
Сообщение от Silly_21
Мне надо сделать оператор для деления двух больших чисел с заданным количеством после запятой, как мне передать это количество в оператор?
Куда и что передать? И о каком lineEdit речь? Если о том что Qt, то вот.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#ifndef WIDGET_H #define WIDGET_H #include #include class Widget : public QWidget { Q_OBJECT private: const int PRECISION=20; QLineEdit* m_pDivisibleLineEdit; QLineEdit* m_pDividerLineEdit; QLineEdit* m_pResultLineEdit; QPushButton* m_pResultPushButton; private slots: void slotResultClicked(); public: Widget(QWidget *parent = nullptr); ~Widget(); }; #endif // WIDGET_H
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
#include "Widget.h" void Widget::slotResultClicked() bool ok{false}; double divisible=m_pDivisibleLineEdit->text().toDouble(&ok); if(ok){ double divider=m_pDividerLineEdit->text().toDouble(&ok); if(ok && divider!=0){ double result=divisible/divider; m_pResultLineEdit->setText(QString::number(result,'f',20)); } } } Widget::Widget(QWidget *parent) : QWidget(parent),m_pDivisibleLineEdit{nullptr}, m_pDividerLineEdit{nullptr},m_pResultLineEdit{nullptr}, m_pResultPushButton{nullptr} { m_pDivisibleLineEdit=new QLineEdit; m_pDivisibleLineEdit->setMaxLength(20); m_pDividerLineEdit=new QLineEdit; m_pDividerLineEdit->setMaxLength(20); m_pResultLineEdit=new QLineEdit; m_pResultLineEdit->setMaxLength(20); m_pResultLineEdit->setReadOnly(true); m_pResultPushButton=new QPushButton("Result"); QObject::connect(m_pResultPushButton, SIGNAL(clicked(bool)), this, SLOT(slotResultClicked())); QGridLayout* pGridLayout=new QGridLayout; pGridLayout->setContentsMargins(10,10,10,10); pGridLayout->setSpacing(10); pGridLayout->addWidget(new QLabel("Divisible:"),0,0); pGridLayout->addWidget(m_pDivisibleLineEdit,0,1); pGridLayout->addWidget(new QLabel("Divider:"),1,0); pGridLayout->addWidget(m_pDividerLineEdit); pGridLayout->addWidget(m_pResultPushButton,2,0); pGridLayout->addWidget(m_pResultLineEdit,2,1); setLayout(pGridLayout); } Widget::~Widget() { }
Регистрация: 24.10.2021
Сообщений: 28
Я записываю данные в строку(lineEdit), и должен как-то передать оператору деления данные о том, сколько чисел должно быть после запятой.
Вот сам код.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
BigNum BigNum::operator /(BigNum d)// d - делитель (Д) { BigNum quotient; //частное QVectorIteratorqint8> it1(vec); QVectorIteratorqint8> it2(d.vec); int itLong1 = size(d); // int itLong2 = size(b); int i = ui->lineEdit_3->text(); int number = 0; // временная переменная в которой будет хранится количество задействованых знаков после запятой BigNum time;// временная переменная(ВП) в которой будет хранится, то из чего будем вычитать while(it1.hasNext()) { if(it1.hasNext()) { time.vec.push_back(it1.peekNext());//добавляет следуйщий символ } int itLong2 = size(time);// длина временной переменной if( itLong2 >= itLong1 && d time)// будет делиться если Д будет больше или равно ВП и если Д бкдет не меньше временной переменной { int p = 0;// результак деления ВП на Д while(!(time d)) { time = time - d; p += 1; } quotient.vec.push_back(p); } } quotient.vec.push_back(','); while(number i) { time.vec.push_back('0'); int itLong2 = size(time); if( itLong2 >= itLong1 && d time)// будет делиться если Д будет больше или равно ВП и если Д бкдет не меньше временной переменной { int p = 0;// результак деления ВП на Д while(!(time d)) { time = time - d; p += 1; } quotient.vec.push_back(p); } } return quotient; }
.
Вот класс в котором определяется оператор деления.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
#ifndef BIGNUM_H #define BIGNUM_H #include class BigNum { public: QVectorqint8> vec; // Массив для хранения цифр числа BigNum(){}; BigNum(QString); QString fromVectortoString(QVectorqint8>); QString toString(); BigNum operator +(BigNum); BigNum operator -(BigNum); BigNum operator /(BigNum b); int size(BigNum); bool operator (BigNum); }; #endif // BIGNUM_H