简体   繁体   中英

PYQT5 crashing when calling .text() on a QLineEdit widget

When I run the code below my program crashes, and I believe this is to-do with the .text() called when the Line edit has something typed in it. I need to assign a variable to what is entered here.

import sys
from PyQt5.QtWidgets import *
from PyQt5 import QtWidgets

class loginScreen(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        usernameBox = QtWidgets.QLineEdit()
        usernameBox.textChanged.connect(self.myfunc)

        vArrangement = QtWidgets.QVBoxLayout()
        vArrangement.addWidget(usernameBox)
        self.setLayout(vArrangement)

        self.show()

    def myfunc(self):
        x = usernameBox.text()
        print(x)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    ex = loginScreen()
    sys.exit(app.exec_())

If you observe usernameBox it is created as a local variable so it can not be accessed by the other methods of the class, in your case there are 2 solutions:

  • Make a usernameBox attribute of the class.

class loginScreen(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        self.usernameBox = QtWidgets.QLineEdit()
        self.usernameBox.textChanged.connect(self.myfunc)

        vArrangement = QtWidgets.QVBoxLayout()
        vArrangement.addWidget(self.usernameBox)
        self.setLayout(vArrangement)

        self.show()

    def myfunc(self):
        x = self.usernameBox.text()
        print(x)
  • Or use sender() that obtains the object that emits the signal, in your case the QLineEdit .

class loginScreen(QtWidgets.QWidget):
    def __init__(self):
        super().__init__()
        self.initUI()

    def initUI(self):
        usernameBox = QtWidgets.QLineEdit()
        usernameBox.textChanged.connect(self.myfunc)

        vArrangement = QtWidgets.QVBoxLayout()
        vArrangement.addWidget(usernameBox)
        self.setLayout(vArrangement)

        self.show()

    def myfunc(self):
        x = self.sender().text()
        print(x)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM