[英]How to convert QTextedit's input to int in pyQt4 python
当我从 tkinter 过渡时,我对 pyqt 相当陌生。 我只想询问两个数字,然后单击“SUM”按钮将两个数字相加并在 gui 上显示输出,但我不断收到诸如“无法将 str 转换为 int”之类的错误,或者有时它根本不输出任何内容。 我觉得我必须将从 QTextedit 获得的输入转换为 int 或 float 但我已经尝试了我知道的所有可能的方法。 我错过了什么?
代码如下
import sys
from PyQt4 import QtCore, QtGui
try:
_fromUtf8 = QtCore.QString.fromUtf8
except AttributeError:
def _fromUtf8(s):
return s
try:
_encoding = QtGui.QApplication.UnicodeUTF8
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig, _encoding)
except AttributeError:
def _translate(context, text, disambig):
return QtGui.QApplication.translate(context, text, disambig)
class Ui_Form(QtGui.QWidget):
def __init__(self):
QtGui.QWidget.__init__(self)
self.setupUi(self)
QtGui.QApplication.setStyle(QtGui.QStyleFactory.create("Plastique"))
def setupUi(self, Form):
Form.setObjectName(_fromUtf8("Form"))
Form.resize(400, 300)
self.sum_button = QtGui.QPushButton(Form)
self.sum_button.setGeometry(QtCore.QRect(10, 20, 75, 23))
self.sum_button.setObjectName(_fromUtf8("sum_button"))
self.sum_button.clicked.connect(self.action)
self.text1 = QtGui.QTextEdit(Form)
self.text1.setGeometry(QtCore.QRect(110, 10, 104, 71))
self.text1.setObjectName(_fromUtf8("text1"))
self.texxt1 = self.text1.toPlainText()
self.text2 = QtGui.QTextEdit(Form)
self.text2.setGeometry(QtCore.QRect(110, 140, 104, 71))
self.text2.setObjectName(_fromUtf8("text2"))
self.texxt2 = self.text2.toPlainText()
self.clear = QtGui.QPushButton(Form)
self.clear.setGeometry(QtCore.QRect(20, 140, 75, 23))
self.clear.setObjectName(_fromUtf8("clear"))
self.retranslateUi(Form)
QtCore.QObject.connect(self.clear, QtCore.SIGNAL(_fromUtf8("clicked()")), self.text2.clear)
QtCore.QObject.connect(self.clear, QtCore.SIGNAL(_fromUtf8("clicked()")), self.text1.clear)
QtCore.QMetaObject.connectSlotsByName(Form)
def action(self):
self.tex = self.texxt1
self.ij = self.texxt2
self.l = self.tex + self.ij
QtGui.QLabel(self.l,self)
def retranslateUi(self, Form):
Form.setWindowTitle(_translate("Form", "Form", None))
self.sum_button.setText(_translate("Form", "sum", None))
self.clear.setText(_translate("Form", "clear", None))
if __name__ == '__main__':
app = QtGui.QApplication(sys.argv)
ex = Ui_Form()
ex.show()
sys.exit(app.exec_())
你有这个:
self.texxt1 = self.text1.toPlainText()
# ...
self.texxt2 = self.text2.toPlainText()
然后,在你的动作处理程序中,你有这个:
def action(self):
self.tex = self.texxt1
self.ij = self.texxt2
self.l = self.tex + self.ij
QtGui.QLabel(self.l,self)
首先,不是尝试将字符串相加,而是需要将值转换为整数。 例如:
total = int(self.texxt1) + int(self.texxt2)
您应该检查异常,以防输入不是数字。
然后,您的处理程序中有这一行:
QtGui.QLabel(self.l,self)
此行创建一个新标签。 无需创建新标签,只需在您的 GUI 中获取一个预先存在的标签,并使用它的setText
方法来显示结果。 例如:
self.result_lbl.setText('{:,}'.format(total))
如果您有一个名为result_lbl
的QLabel
小部件,则会显示结果。
它仍然没有输出任何结果
您的问题的根源在于以下几行:
self.texxt1 = self.text1.toPlainText()
# ...
self.texxt2 = self.text2.toPlainText()
请注意,您试图在 UI 初始化期间获取QTextEdit
小部件的内容,这是在用户有机会输入任何内容之前。 然后您尝试使用空字符串进行计算,这将永远无法工作。 (顺便说一句,我认为有更好的小部件选择,例如QLineEdit
)
相反,您需要等到用户按下“求和”按钮才能完成工作。 只有在这一点上,可以合理地预期用户会输入某些内容。
例如,假设您已按照我的建议添加了结果标签result_lbl
,您会看到如下内容:
def action(self):
val1 = int(self.text1.toPlainText())
val2 = int(self.text2.toPlainText())
self.result_lbl.setText(_fromUtf8("<b>Result:</b> {:,}".format(val1 + val2)))
要添加QLabel
,请将此代码片段添加到您的setupUi
方法中:
self.result_lbl = QtGui.QLabel(Form)
self.result_lbl.setGeometry(QtCore.QRect(20, 250, 75, 23))
self.result_lbl.setObjectName(_fromUtf8("result_lbl"))
self.result_lbl.setText(_fromUtf8("<b>Result:</b>"))
这已经过测试(使用 Python3)作为对您最初发布的代码的修改,并且可以正常工作。 如果它不适合你,你需要重新检查你的代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.