2017-02-27 69 views
0

此代码的目的是让一个正方形出现在画布上一段时间,然后擦除。我明白所有的绘画事件都必须由重载的函数paintEvent来处理。使矩形闪烁PyQt(Python)

但是,首先,正方形没有被绘制,我相信,正方形应该被绘制和擦除的时间也没有被尊重。我猜这是由于事件出现的频率所致。

我已经试过在函数drawApple和eraseApple下调用QPaintEvent。我错过了什么?

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

建议您在python2.7旁边添加一个python标签 – abccd

回答

0

应该叫update()功能调用paintEvent()。另外我建议为该任务使用一个计时器。你只需要拒绝变量draw_apple来改变状态。

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