2017-02-27 6 views
0

Der Zweck dieses Codes ist es, ein Quadrat zu haben, das für einige Zeit in einem Canvas erscheint und dann gelöscht wird. Ich verstehe, dass alle Bildereignisse von der überladenen Funktion paintEvent bearbeitet werden müssen.Machen Sie ein Rechteck blinken PyQt (Python)

Zuerst werden die Quadrate jedoch nicht gezeichnet, und ich glaube, dass die Zeiten, zu denen die Quadrate gezeichnet und gelöscht werden sollen, auch nicht respektiert werden. Meine Vermutung ist, dass dies aufgrund der Häufigkeit geschieht, mit der das Ereignis auftritt.

Ich habe bereits versucht, QPaintEvent unter den Funktionen DrawApple und EraseApple aufzurufen. Was vermisse ich?

import sys, random 
import numpy as np 
import math 
from PyQt4 import QtCore, QtGui 
from PyQt4.QtCore import QTimer 
from PyQt4.QtCore import QRect 
from PyQt4.QtGui import QPaintEvent 

class Game(QtGui.QMainWindow): 

    def __init__(self): 
     super(Game, self).__init__() 
     self.initUI() 

    def initUI(self): 
     palette = QtGui.QPalette() 
     palette.setColor(QtGui.QPalette.Background, QtCore.Qt.white) 
     self.setPalette(palette) 
     self.tboard = Board(self) 
     self.setCentralWidget(self.tboard) 
     self.resize(400, 400) 
     self.center() 
     self.setWindowTitle('Game') 
     self.show() 
    def center(self): 
     screen = QtGui.QDesktopWidget().screenGeometry() 
     size = self.geometry() 
     self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) 


class Board(QtGui.QFrame): 
    BoardWidth = 400 
    BoardHeight = 400 
    SquareWidth = 15 
    SquareHeight = 15 
    Speed = 10000 

    def __init__(self, parent): 
     super(Board, self).__init__(parent) 
     #self.setAutoFillBackground(True) 
     self.setFocusPolicy(QtCore.Qt.StrongFocus) 
     self.timer_draw = QtCore.QTimer() 
     self.timer_draw.timeout.connect(self.drawApple) 
     self.timer_draw.start(self.Speed) 
     self.timer_draw.setInterval(self.Speed) 
     self.timer_erase = QtCore.QTimer() 
     self.timer_erase.timeout.connect(self.eraseApple) 
     self.timer_erase.start(self.Speed + self.Speed/2) 
     self.timer_erase.setInterval(self.Speed) 
     self.apple_color = QtCore.Qt.red 
     self.bkg_color = QtCore.Qt.white 
     self.draw_apple = False 
     self.x_apple = 0 
     self.y_apple = 0 
     self.rect = QRect(self.x_apple, self.y_apple, self.SquareWidth, self.SquareHeight) 

    def paintEvent(self, event): 
     painter = QtGui.QPainter(self) 
     print "Paint Event?" 
     if self.draw_apple == True: 
      print "Draw" 
      self.apple_color = QtCore.Qt.red 
     else: 
      print "Do not draw" 
      self.apple_color = self.bkg_color 
     painter.setPen(self.apple_color) 
     painter.drawRect(self.rect) 

    def drawApple(self): 
     print "Enters drawApple" 
     self.x_apple = np.random.randint(0, math.floor(self.BoardWidth/self.SquareWidth)) * self.SquareWidth 
     self.y_apple = np.random.randint(0, math.floor(self.BoardHeight/self.SquareHeight)) * self.SquareHeight 
     self.draw_apple == True 


    def eraseApple(self): 
     print "Enters eraseApple" 
     self.draw_apple == True 

def main(): 

    app = QtGui.QApplication([]) 
    game = Game()  
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
+0

Ich würde Ihnen empfehlen, ein Python-Tag neben python2.7 hinzuzufügen – abccd

Antwort

0

Sie sollten die update() Funktion aufrufen, wie es paintEvent() nennt. Ich empfehle auch, einen einzelnen Timer für diese Aufgabe zu verwenden. Sie müssen nur die Variable draw_apple ablehnen, um den Status zu ändern.

import sys, random 
import numpy as np 
import math 
from PyQt4 import QtCore, QtGui 
from PyQt4.QtCore import QTimer, QRect 
from PyQt4.QtGui import QPaintEvent 

class Game(QtGui.QMainWindow): 

    def __init__(self): 
     super(Game, self).__init__() 
     self.initUI() 

    def initUI(self): 
     palette = QtGui.QPalette() 
     palette.setColor(QtGui.QPalette.Background, QtCore.Qt.white) 
     self.setPalette(palette) 
     self.tboard = Board(self) 
     self.setCentralWidget(self.tboard) 
     self.resize(400, 400) 
     self.center() 
     self.setWindowTitle('Game') 
     self.show() 

    def center(self): 
     screen = QtGui.QDesktopWidget().screenGeometry() 
     size = self.geometry() 
     self.move((screen.width()-size.width())/2, (screen.height()-size.height())/2) 


class Board(QtGui.QFrame): 
    BoardWidth = 400 
    BoardHeight = 400 
    SquareWidth = 15 
    SquareHeight = 15 
    Speed = 10000 

    def __init__(self, parent): 
     super(Board, self).__init__(parent) 
     #self.setAutoFillBackground(True) 
     self.setFocusPolicy(QtCore.Qt.StrongFocus) 
     self.timer_draw = QtCore.QTimer(self) 
     self.timer_draw.timeout.connect(self.drawApple) 
     self.timer_draw.start(self.Speed) 

     self.apple_color = QtCore.Qt.red 
     self.draw_apple = False 
     self.x_apple = 0 
     self.y_apple = 0 
     self.drawApple() 

    def paintEvent(self, event): 
     painter = QtGui.QPainter(self) 
     print "Paint Event?" 
     if self.draw_apple == True: 
      print "Draw" 
      self.apple_color = QtCore.Qt.red 
     else: 
      print "Do not draw" 
      self.apple_color = QtCore.Qt.white 
     painter.setPen(self.apple_color) 
     painter.drawRect(self.rect) 

    def drawApple(self): 
     self.draw_apple = not self.draw_apple 

     self.x_apple = np.random.randint(0, math.floor(self.BoardWidth/self.SquareWidth)) * self.SquareWidth 
     self.y_apple = np.random.randint(0, math.floor(self.BoardHeight/self.SquareHeight)) * self.SquareHeight 

     self.rect = QRect(self.x_apple, self.y_apple, self.SquareWidth, self.SquareHeight) 
     self.update() 

def main(): 

    app = QtGui.QApplication([]) 
    game = Game()  
    sys.exit(app.exec_()) 

if __name__ == '__main__': 
    main() 
Verwandte Themen