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

时间:2019-04-21 12:26:51

标签: pyqt qwidget qlabel qpixmap

我正在用pyqt5编程蛇。然后,我尝试在构造函数中使用self.spawnFruit(),一切正常,然后在Window中看到结果。 但是,当我尝试在 init ()之外使用相同的功能时,窗口上没有任何显示。

例如我有一个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_()

1 个答案:

答案 0 :(得分:0)

请尝试使用此代码。

说明

有几点要说,但是主要问题是为什么新标签不显示?

在python中,使用PyQtPySide。我们预先准备了小部件,并将它们设置为主要小部件,并在最后一次显示它们。

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

event.key() == Qt.Key_F:是keyEvent的惯用法。

通常很困惑。

并且请警告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_())