2016-11-20 64 views
1

我正在用PyQt5编写一个计算器,用户界面已经完成,但是当我改变QLineEdit的内容时有一个问题。改变它的细节方法是当用户按下按钮时调用QLineEdit.setText()方法。如何在程序运行时更改QPyLineEdit的内容?

但是当我按下PushButton时,程序结束并显示如下消息:“Process completed with exit code 1”。没有任何错误或警告信息。这是下面的完整程序:

# -*- coding:utf-8 -*- 
import sys 
from PyQt5.QtWidgets import (QWidget, QGridLayout, 
     QPushButton, QLineEdit, QVBoxLayout, QApplication, QMessageBox) 


class Calculator(QWidget): 
    def __init__(self): 
     super().__init__() 
     self.initUI() 

    def initUI(self): 
     # grid = QGridLayout() 
     qvbox = QVBoxLayout() 
     gridBar = QGridLayout() 
     gridWidget = QWidget() 

     numberEdit = QLineEdit() 
     numberEdit.setReadOnly(True) 

     names = ["Cls", "Bck", "", "Close", 
       "7", "8", "9", "/", 
       "4", "5", "6", "*", 
       "1", "2", "3", "-", 
       "0", ".", "=", "+"] 

     position = [(i, j) for i in range(5) for j in range(4)] 

     for position, name in zip(position, names): 
      if name == "": 
       continue 
      button = QPushButton(name) 
      gridBar.addWidget(button, *position) 
      button.clicked.connect(self.buttonClicked) 
     qvbox.addWidget(numberEdit) 
     gridWidget.setLayout(gridBar) 
     qvbox.addWidget(gridWidget) 

     self.setLayout(qvbox) 

     self.move(300, 150) 
     self.setWindowTitle("Calculator") 
     self.show() 

    def buttonClicked(self): 
     sender = self.sender() 
     self.dealData(sender.text()) 

    def dealData(self, data): 
     self.numberEdit.setText(data) # Here, the program exited!!! 
     print(data) # The output in consle was right. 

if __name__ == "__main__": 
    app = QApplication(sys.argv) 
    ex = Calculator() 
    sys.exit(app.exec_()) 

我在哪里犯了一个错误?

回答

0

您必须设置一个属性numberEdit以便以后可以访问它:

class Calculator(QWidget): 
    ...  
    def initUI(self): 
     ... 
     self.numberEdit = QLineEdit() 
     self.numberEdit.setReadOnly(True) 

此外,您还需要追加新的文本,所以dealData应该是这样的:

def dealData(self, data): 
     self.numberEdit.end(False) 
     self.numberEdit.insert(data) 
     print(data) # The output in consle was right. 
+0

非常感谢你。但是,当我更改代码后,问题仍然发生。而且我试图将代码“self.numberEdit.setReadOnly(True)”更改为“self.numberEdit.setReadOnly(False)”,问题仍然存在。 – user7102471

+0

@ user7102471。那是因为你输入了“SetText”而不是“setText”。无论如何,我已经在我的回答中提出了更好的解决方案。 – ekhumoro

+0

太棒了!有用!感谢您的帮助! – user7102471