set widget from keypress event

pyqt, pyqt5, python, python-3.x

Solution

The problem arises from the misuse of the global variable, this has to be declared every time you use it, in your case:

class HelloWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)
        [...]
        global gridLayout
        gridLayout = QGridLayout(self)
        [...]

    def keyPressEvent(self, event):
      if event.key() == QtCore.Qt.Key_Escape:
         self.close()
      if event.key() == QtCore.Qt.Key_Space:
        global gridLayout
        item = gridLayout.itemAtPosition(1, 1)
        w = item.widget()
        w.setText("test")

A more elegant solution is to declare `gridLayout` as an attribute of the class, for this you must change `gridLayout` to `self.gridLayout` in all cases:

class Position:
   def __init__(self, x, y):
      self.x = x
      self.y = y

class HelloWindow(QMainWindow):
    def __init__(self):
        QMainWindow.__init__(self)

        self.setMinimumSize(QSize(640, 640))    
        self.setWindowTitle("Hello world") 

        centralWidget = QWidget(self)          
        self.setCentralWidget(centralWidget)   
        self.gridLayout = QGridLayout(self)
        self.gridLayout.setSpacing(0)  
        centralWidget.setLayout(self.gridLayout)  

        file_text = open("logic/file.txt", "r")
        file = file_text.read()
        file = file.replace("[(", "")
        file = file.replace(")]", "")
        file = file.replace("),(", ";")
        positions = file.split(';')
        lista = []
        for pos in positions:
            coord = pos.split(',')
            temp = Position(int(coord[0]), int(coord[1]))
            lista.append(temp)
        file_text.close()

        cont = 0
        for x in range(0, 9):
            for y in range(0, 9):
                if cont < 64:
                    title = QLabel(str(cont+1), self) 
                    title.setAlignment(QtCore.Qt.AlignCenter)
                    title.setContentsMargins(0, 0, 0, 0)
                    title.setStyleSheet('QLabel {background-color: white; color: red; font-size: 24px; font-weight: bold}')
                    if cont%2 == 0:
                       title.setStyleSheet('QLabel {background-color: black; color: red; font-size: 24px; font-weight: bold}')
                    self.gridLayout.addWidget(title, lista[cont].x, lista[cont].y)
                    cont += 1

    def keyPressEvent(self, event):
        if event.key() == QtCore.Qt.Key_Escape:
            self.close()
        if event.key() == QtCore.Qt.Key_Space:
            item = self.gridLayout.itemAtPosition(1, 1)
            w = item.widget()
            w.setText("test")

if __name__ == "__main__":
    app = QtWidgets.QApplication(sys.argv)
    mainWin = HelloWindow()
    mainWin.show()
    sys.exit(app.exec_())

Problem

I'm trying set a widget when I press space key. I have a QGridLayout that contain QLabel's. I want to set text of a specific Qlabel from your coord in the QGridLayout, but when I access to QGridLayout from my keypress function, the variable is null. ``` import sys from PyQt5 import QtCore, QtWidgets from PyQt5.QtWidgets import QMainWindow, QLabel, QGridLayout, QWidget from PyQt5.QtCore import QSize class Position: def __init__(self, x, y): self.x = x self.y = y class HelloWindow(QMainWindow): global gridLayout def __init__(self): QMainWindow.__init__(self) self.setMinimumSize(QSize(640, 640)) self.setWindowTitle("Hello world") centralWidget = QWidget(self) self.setCentralWidget(centralWidget) gridLayout = QGridLayout(self) gridLayout.setSpacing(0) centralWidget.setLayout(gridLayout) file_text = open("logic/file.txt", "r") file = file_text.read() file = file.replace("[(","") file = file.replace(")]","") file = file.replace("),(",";") positions = file.split(';') lista = [] for pos in positions: coord = pos.split(',') temp = Position(int(coord[0]),int(coord[1])) lista.append(temp) file_text.close() cont = 0 for x in range(0, 9): for y in range(0, 9): if cont < 64: title = QLabel(str(cont+1), self) title.setAlignment(QtCore.Qt.AlignCenter) title.setContentsMargins(0,0,0,0) title.setStyleSheet('QLabel {background-color: white; color: red; font-size: 24px; font-weight: bold}') if cont%2 == 0: title.setStyleSheet('QLabel {background-color: black; color: red; font-size: 24px; font-weight: bold}') gridLayout.addWidget(title,lista[cont].x,lista[cont].y) cont += 1 def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() if event.key() == QtCore.Qt.Key_Space: item = gridLayout.itemAtPosition(1,1) w = item.widget() w.setText("test") if __name__ == "__main__": app = QtWidgets.QApplication(sys.argv) mainWin = HelloWindow() mainWin.show() sys.exit( app.exec_() ) ``` The next section is a test ``` def keyPressEvent(self, event): if event.key() == QtCore.Qt.Key_Escape: self.close() if event.key() == QtCore.Qt.Key_Space: item = gridLayout.itemAtPosition(1,1) w = item.widget() w.setText("test") ``` I access to widget from your coord for set your text.

Original source