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.
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_())
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.