2016-11-20 11 views
1

Я пишу калькулятор с помощью PyQt5, пользовательский интерфейс был закончен, но возникает вопрос, когда я изменил содержимое QLineEdit. Детальный способ его изменения - это вызов метода QLineEdit.setText(), когда пользователь нажимает кнопку.Как изменить содержимое QPyLineEdit, когда программа запущена?

Но когда я нажимаю кнопку PushButton, программа закончила и показала следующее сообщение: «Процесс завершен с кодом выхода 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) 

Кроме того, вам нужно Append новый текст, так 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

@ пользователь7102471. Это потому, что вы набрали 'SetText' вместо' setText'. Во всяком случае, я поставил лучшее решение в своем ответе. – ekhumoro

+0

Отлично! Оно работает! Спасибо за помощь! – user7102471