在PyQt

时间:2017-02-27 18:55:38

标签: python python-2.7 pyqt pyqt4

此代码的目的是让一个方块在画布中出现一段时间然后被删除。我知道所有绘制事件都必须由重载函数paintEvent处理。

然而,首先,正方形没有被绘制,我相信,正方形应该被绘制和删除的时间也没有得到尊重。我猜这是由于事件出现的频率而发生的。

我已经尝试在函数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()

1 个答案:

答案 0 :(得分: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()