Вызов функции работает только в конструкторе, в противном случае функция порождает невидимую метку - PullRequest
0 голосов
/ 21 апреля 2019

Я программирую змею с pyqt5.Затем я пытаюсь использовать self.spawnFruit () в конструкторе, все работает, и я вижу плоды в окне.Но когда я пытаюсь использовать ту же функцию за пределами init (), в этом окне ничего не появляется.

Например, у меня есть Key.Event, который вызывает функцию self.spawnFruit, если я нажимаюF.

Кажется, что ярлыки на 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 голосов
/ 21 апреля 2019

Пожалуйста, попробуйте этот код.

Объяснение

Есть несколько моментов, которые нужно сказать, но главная проблема в том, почему новые ярлыки не появляются?

В питоне, с PyQt и PySide.Мы заранее подготавливаем виджеты, устанавливаем их в основной виджет и показываем их все в последний раз.

Если вы хотите добавить в него новый видимый элемент, вы должны четко вызвать setVisible(True) соответственно.

и event.key() == Qt.Key_F: - это идиома ключевых событий.

Это часто путают.

И, пожалуйста, предупредите 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_())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...