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.