在blit期间不得锁定表面

时间:2014-03-10 22:20:22

标签: python fonts pygame screen rect

我正在尝试将文本绘制到位于2d数组正方形中的一堆rects上方的空间中的屏幕上。当我尝试在屏幕上绘制文本时,它会说“在blit期间不得锁定曲面。”

我尝试过解锁,没有任何区别。

import sys, time, random, pygame
from pygame import *
from time import time,sleep
pygame.init()
global isDragging, inDrag, rightDrag, lastDrag, inDragRight, mouseX,mouseY, borderHeight
isDragging = False
isAuto = False
inDrag= False
inDragRight = False
isFilling = False
done = False
lastDrag = None
rightDrag = None
tickTime = 300
font = pygame.font.SysFont(None, 12,False,False)
dragDelay = 2
BLACK    = (   0,   0,   0)
WHITE    = ( 255, 255, 255)
GREEN    = (   0, 255,   0)
RED      = ( 255,   0,   0)
PINK     = ( 255, 150, 200)
BLUE     = (   0,   0, 255)
RED = GREEN
width, height, margin = 100, 100, 1
noWidth, noHeight = 6,6
speed = [2, 2]
borderHeight = 50
size = (width*noWidth,height*noHeight + borderHeight)
screen = pygame.display.set_mode(size)
pygame.display.set_caption("PieStone")
clock = pygame.time.Clock()
pixArray = pygame.PixelArray(screen)
font = pygame.font.SysFont("monospace", 15)
word = font.render("test", 1, (0, 0, 0))

class Null:
    pass
square = [[Null() for i in range(noHeight)]for i in range(noWidth)]
for d1 in range(noWidth):
    for d2 in range(noHeight):
        square[d1][d2].man = False
        square[d1][d2].visits = 0
        square[d1][d2].colour = BLACK
        square[d1][d2].margin = 1
a = 1
i = 1

def text(word,size,pos1,pos2,pos3):
    word = font.render(str(word),size,(pos1,pos2,pos3))
    return word



def colide(obj,mouseX,mouseY):
    if obj.collidepoint(mouseX,mouseY) == 1:
        return True
    else:
        return False

def click(mouseX,mouseY):
    #rint("left")
    global inDrag,lastDrag
    for d1 in range(noWidth):
        for d2 in range(noHeight):
            if colide(square[d1][d2].rect,mouseX,mouseY):
                square[d1][d2].man = True
                #print("square",d1,d2,"has been clicked")
                try:
                    if square[d1][d2] != lastDrag:
                        inDrag = True
                        lastDrag = square[d1][d2]
                    else:
                        inDrag = False
                except UnboundLocalError:
                    print("error")
                    lastDrag = square[d1][d2]
                #print(inDrag)

                if square[d1][d2].margin == 0 and inDrag:
                    square[d1][d2].margin = 1
                    square[d1][d2].visits = square[d1][d2].visits + 1
                elif square[d1][d2].margin == 1 and inDrag:
                    square[d1][d2].margin = 0
                    square[d1][d2].visits = square[d1][d2].visits + 1
                break 
                '''if square[d1][d2].visits >= 5 and square[d1][d2].colour == BLACK:
                    square[d1][d2].visits = 0
                    square[d1][d2].colour = RED
                elif square[d1][d2].visits >= 5 and square[d1][d2].colour == RED:
                    square[d1][d2].visits = 0
                    square[d1][d2].colour = BLACK'''

def rightClick(mouseX,mouseY):

    #print("right")
    global inDragRight, lastRight
    for d1 in range(noWidth):
        for d2 in range(noHeight):

            if colide(square[d1][d2].rect,mouseX,mouseY):
                square[d1][d2].man = True
                #print("colide")
                try:
                    if square[d1][d2] != lastRight:
                        inDragRight = True
                        lastRight = square[d1][d2]
                    else:
                        inDragRight = False
                except:
                    print("error")
                    lastRight = square[d1][d2]

                #print(inDragRight)
                if square[d1][d2].colour == RED and inDragRight:
                    square[d1][d2].colour = BLACK
                    #print("black")
                elif square[d1][d2].colour == BLACK and inDragRight:
                    square[d1][d2].colour = RED
                    #print("red")
                break     

while not done:
    screen.blit(word, (0, 0))
    (mouseX,mouseY) = pygame.mouse.get_pos()
    #print(str(mouseX)+",",mouseY)

    for event in pygame.event.get(): # User did something
        if event.type == pygame.QUIT: # If user clicked close
            done = True # Flag that we are done so we exit this loop
        elif event.type == pygame.MOUSEBUTTONDOWN:
            #print(mouseX,mouseY)
            if pygame.mouse.get_pressed()[0] == 1:
                isDragging = True
            if pygame.mouse.get_pressed()[2] == 1:
                isFilling = True

            elif pygame.mouse.get_pressed()[1] == 1:
                isAuto = True
            #print(pygame.mouse.get_pressed())
        elif event.type == pygame.MOUSEBUTTONUP:
            #print("up")
            isDragging = False
            isFilling = False
            lastDrag = None
            lastRight = False
            if pygame.mouse.get_pressed()[0] == 1:
                isDragging = True
            if pygame.mouse.get_pressed()[2] == 1:
                isFilling = True
    if isAuto:
        rnd1 = random.randint(0,1)
        if rnd1 == 1:
            isDragging = True
            isFilling = False
        else:
            isDragging = False
            isFilling = True
        (mouseX,mouseY) = (random.randint(0,width*noWidth),random.randint(0,height*noHeight)+borderHeight)
        #print(mouseX,mouseY)
    if isDragging:
        click(mouseX,mouseY)
    if isFilling:
        rightClick(mouseX,mouseY)
    screen.fill(WHITE)
    # --- Game logic should go here
    i = 0
    for d1 in range(noWidth):
        if noHeight % 2 == 0:
            '''if i == 0:
                i = 1
            else:
                i = 0'''
        for d2 in range(noHeight):

            #if i % a == 0:
            try:

                if i == 0:
                    pass
                elif i == 1:
                    pass

            except AttributeError:
                print("AttributeError")
                square[d1][d2].margin = random.randint(0,1)

            #print(square[d1][d2].visits)

            square[d1][d2].rect = pygame.draw.rect(screen, square[d1][d2].colour, [(d1*width), ((d2*height)+borderHeight),width,(height)],square[d1][d2].margin)
            #print("d1*width:",d1*width,"d2*height:",d2*height,"d1*width+width:",d1*width+width,"d2*height+height:",d2*height+height)

    pygame.display.flip()
    clock.tick(tickTime)
# Close the window and quit.
# If you forget this line, the program will 'hang'
# on exit if running from IDLE.
pygame.quit()

1 个答案:

答案 0 :(得分:2)

您正在使用PixelArray

pixArray = pygame.PixelArray(screen)

但使用PixelArray会锁定您的Surface,如文档中所述:

  

在PixelArray的生命周期中,PixelArray会锁定曲面,因此一旦不再使用它就明确地必须删除它,并且曲面应该在相同的范围内执行操作。

只需删除该行,因为您还没有使用它。