函数调用仅在构造函数中有效,否则函数会生成一个不可见的标签

Function call only works in constructor, otherwise function spawns an invisible label

我正在用 pyqt5 编写 snake。然后我尝试在构造函数中使用 self.spawnFruit() 一切正常,我在 Window 中看到了成果。 但是当我尝试在 init() 之外使用相同的函数时,window 上什么也没有出现。

例如我有一个 Key.Event,如果我按 F.

,它将调用函数 self.spawnFruit

Gui上好像有标签,但是看不见。

import sys
from PyQt5.QtCore import Qt
import PyQt5.QtWidgets as qw
from PyQt5 import QtGui as gui
from PyQt5 import QtCore as core
import numpy as np

spielfeldgröße = 16
state = [[0 for y in range(spielfeldgröße)] for x in range(spielfeldgröße)]
size = 30#10 pixel

class GameWindow(qw.QWidget):

    def __init__(self):
        super().__init__()
        self.setGeometry(500,500,500,500)

        self.spawnFruit() #spawns a fruit

    def spawnFruit(self):
        fruitpixmap = gui.QPixmap(size,size)
        fruitpixmap.fill(Qt.red)

        #find available spots to spawn fruits on the map
        available = list()
        for x in range(spielfeldgröße):
            for y in range(spielfeldgröße):
                if self.state[x][y] == 0:
                    available.append((x,y))

        lenght = len(available)
        rand = np.random.randint(0, lenght)

        x,y = available[rand]
        print("fruit at:", x, ":", y)
        #spawn
        label = qw.QLabel(self)
        label.setPixmap(fruitpixmap)
        label.move(x*size, y*size)

    def keyPressEvent(self, event):
        if(key == Qt.Key_F):
            self.spawnFruit() #doesn't spawns a fruit
        else:
            super().keyPressEvent(event)


app = qw.QApplication(sys.argv)
win = GameWindow()
win.show()
app.exec_()

请尝试此代码。

说明

有几点要说,但主要问题是为什么新标签没有出现?

在 python 中,带有 PyQtPySide。我们提前准备好widgets,设置为主widget,最后一次全部展示。

如果要向其中添加新的可见项,必须分别调用清楚setVisible(True)

event.key() == Qt.Key_F:是keyEvents的成语。

经常混淆。

并且请注意IndexError的状态。 列表从 0 开始,所以你经常会遇到 IndexError.

from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *
import sys
import random
spielfeldgröße = 16

size = 30#10 pixel
class GameWindow(QWidget):

    def __init__(self):
        super().__init__()
        self.setGeometry(500,500,500,500)
        self.state = [[0 for y in range(spielfeldgröße)] for x in range(spielfeldgröße)]
        self.spawnFruit() #spawns a fruit

    def spawnFruit(self):

        fruitpixmap = QPixmap(size,size)
        fruitpixmap.fill(Qt.red)

        #find available spots to spawn fruits on the map
        available = list()
        for x in range(spielfeldgröße-1):
            for y in range(spielfeldgröße-1):
                if self.state[x][y] == 0:
                    available.append((x,y))

        lenght = len(available)
        rand = random.randint(0, lenght - 1)

        x,y = available[rand]
        print("fruit at:", x, ":", y)
        #spawn
        label = QLabel(self)
        label.setPixmap(fruitpixmap)  
        label.move(x*size, y*size)
        label.setVisible(True)

    def keyPressEvent(self, event):
        if(event.key() == Qt.Key_F):
            self.spawnFruit() #doesn't spawns a fruit
        else:
            super().keyPressEvent(event)


app = QApplication(sys.argv)
win = GameWindow()
win.show()
sys.exit(app.exec_())