变量值更改时,文本对象未在屏幕上更新

时间:2019-03-30 18:13:31

标签: python windows pygame

我有一些代码可以创建一个按钮,而代码可以创建一些在屏幕上显示的文本。目的是使按钮单击时将1添加到变量中,并使更改反映在屏幕上(即单击按钮时,屏幕上的值从0到1,然后从1到2,依此类推)。

按钮功能:

def button(message, x, y, w, h, activeRGB, inactiveRGB, action=None): #example of color param for line 61/63 
    mouse = pygame.mouse.get_pos() #get location of mouse recorded by pygame
    click = pygame.mouse.get_pressed()

    if x+w > mouse[0] > x and y+h > mouse[1] > y: 
        pygame.draw.rect(gameDisplay, activeRGB, (x, y, w, h))
        if click[0] ==1 and action != None:
            if action == "countUP": 
                clickCounter+= 1
                print(str(clickCounter)) # print to check that the button actually changes the value 
                pygame.display.update()

    else: 
        pygame.draw.rect(gameDisplay, inactiveRGB, (x, y, w, h))

    smallText = pygame.font.Font("freesansbold.ttf", 20) 
    textSurf, textRect = textBox(message, mediumText) 
    textRect.center = (  (x + (w/2)), y+(h/2))
    gameDisplay.blit(textSurf, textRect)

我到目前为止的逻辑

gameDisplay.fill(white)
pygame.display.update()
clickCounter = str(clickCounter) 

textObject(clickCounter, black, mediumText, 200, 200) 

closeGame = False   

while not closeGame: # this keeps the window from shutting down 
    for thing in pygame.event.get(): 
        if thing.type == pygame.QUIT: 
            closeGame = True 

        print(thing)

    button("Click me!", 300, 300, 100, 100, blue, brightBlue, "countUP")
    pygame.display.update()
    clock.tick(20)

gameDisplay.fill(white)
pygame.display.update()
#logicloop()

按钮功能的确显示正在更改clickCounter的值,但未反映在屏幕上。我的猜测是,尽管我没有尝试任何操作,但是缺少了blit命令或屏幕更新。

无论出于什么原因,当我将此代码块设置为随后要调用的函数时,它都没有出现gameDisplay.fill(white)或屏幕上其他任何元素的情况下运行,我将如何设置它作为使更多逻辑添加更加容易的功能?

所有代码:

import pygame 

pygame.init() 

displayWidth = 700 
displayHeight = displayWidth 

gameDisplay = pygame.display.set_mode((700,700))

clock = pygame.time.Clock()

black = (0, 0, 0) 
brightBlue = (0, 0, 225) 
blue = (0, 0, 255) 

white = (255, 255, 255) #predef colors to make temp rgb value coding easier 

closeGame = False 

mediumText = pygame.font.Font("freesansbold.ttf", 70) #initalize font 
clickCounter = 0 

#def fontSize (pxsize):

    #pygame.font.Font("freesandsbold.ttf", pxsize)

def textObject (text, color, font, x, y):
    storedGenerate = font.render(text, 1, ((color))) 
    gameDisplay.blit(storedGenerate, (x,y)) 

def textBox(text, font): #purely for returning rectangle around font// used for btn function only, tObject for displaying text  

    textSurface = font.render(text, True, black) #swap black for rgb later
    return textSurface, textSurface.get_rect()

def button(message, x, y, w, h, activeRGB, inactiveRGB, action=None): #example of color param for line 61/63 
    mouse = pygame.mouse.get_pos() #get location of mouse recorded by pygame
    click = pygame.mouse.get_pressed()
    global clickCounter
    clickCounter = 0 

    if x+w > mouse[0] > x and y+h > mouse[1] > y: 
        pygame.draw.rect(gameDisplay, activeRGB, (x, y, w, h))
        if click[0] ==1 and action != None:
            if action == "countUP": 
                clickCounter+= 1
                print(str(clickCounter)) 
                pygame.display.update()

    else: 
        pygame.draw.rect(gameDisplay, inactiveRGB, (x, y, w, h))

    #smallText = pygame.font.Font("freesansbold.ttf", 20) # constant has been declared, try deleting line when done w/ proj 
    smallText = pygame.font.SysFont('Times New Roman', 20)
    textSurf, textRect = textBox(message, smallText) 
    textRect.center = (  (x + (w/2)), y+(h/2))
    gameDisplay.blit(textSurf, textRect)

gameDisplay.fill(white)
pygame.display.update()
clickCounter = str(clickCounter) 

textObject(clickCounter, black, mediumText, 200, 200) 

closeGame = False   

while not closeGame: # this keeps the window from shutting down 
    for thing in pygame.event.get(): 
        if thing.type == pygame.QUIT: 
            closeGame = True 

        print(thing)

    button("Click me!", 300, 300, 100, 100, blue, brightBlue, "countUP")
    pygame.display.update()
    clock.tick(20)


gameDisplay.fill(white)
pygame.display.update()
#logicloop()

pygame.quit()
quit()

1 个答案:

答案 0 :(得分:0)

第一个问题是,将clickCounter中存储的数字值转换为字符串。 删除:

lickCounter = str(clickCounter)

在函数button中,clickCounter的值连续设置为0。也将其删除:

  def button(message, x, y, w, h, activeRGB, inactiveRGB, action=None):
      mouse = pygame.mouse.get_pos() #get location of mouse recorded by pygame
      click = pygame.mouse.get_pressed()
      global clickCounter
      # clickCounter = 0 <------ delete

      # [...]

您错过了在主循环中绘制更改的文本的操作。在绘制文本之前,必须清除“旧”文本。在应用程序的主循环中连续重绘整个场景。 这意味着显示必须由背景色填充,并且必须重新绘制文本和按钮:

while not closeGame: # this keeps the window from shutting down 
    for thing in pygame.event.get(): 
        if thing.type == pygame.QUIT: 
            closeGame = True 

        print(thing)

    gameDisplay.fill(white)
    button("Click me!", 300, 300, 100, 100, blue, brightBlue, "countUP")
    textObject(str(clickCounter), black, mediumText, 200, 200) 
    pygame.display.update()
    clock.tick(20)