Pygame:如何更改背景颜色[重复]

Posted

技术标签:

【中文标题】Pygame:如何更改背景颜色[重复]【英文标题】:Pygame: how to change background color [duplicate] 【发布时间】:2017-05-02 13:50:41 【问题描述】:
import pygame, sys
pygame.init()
screen = pygame.display.set_mode([800,600])
white = [255, 255, 255]
red = [255, 0, 0]
screen.fill(white)
pygame.display.set_caption("My program")
pygame.display.flip()



background = input("What color would you like?: ")
if background == "red":
    screen.fill(red)

running = True
while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
        running = False
        pygame.quit()

我试图询问用户他想要什么背景颜色。如果用户写红色,颜色不会改变,仍然保持白色。

【问题讨论】:

请包含一个可运行的示例。您粘贴的不是语法有效的 Python,运行时会出错。 您的代码末尾似乎存在转录错误,因为缩进不正确(在if i.type == pygame.QUIT: 之后)。 pygame 在缓冲区中绘制,pygame.display.flip() 在监视器上发送缓冲区。 请包含适当的缩进以避免在第 21 行和第 22 行运行时出现错误,因为它们需要再缩进一次才能正常运行。 【参考方案1】:

实际上,screen.fill(red) 改变了 Surface 对象 screen 中像素的颜色。更改颜色后需要更新显示。 但是请注意,您应该只在应用程序循环结束时更新一次显示。每帧多次更新显示会导致闪烁。另见Why is the PyGame animation is flickering。

backcolor = white
if background == "red":
    backcolor = red

running = True
while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
        running = False

    # clear background
    screen.fill(backcolor)

    # draw scene
    # [...]

    # update display
    pygame.display.flip() 

解释:

您实际上是在 Surface 对象上绘图。如果您在与 PyGame 显示关联的 Surface 上绘图,这不会立即在显示中可见。当使用pygame.display.update()pygame.display.flip() 更新显示时,这些更改变为可见。

pygame.display.flip():

这将更新整个显示的内容。

pygame.display.flip() 将更新整个显示的内容,pygame.display.update() 只允许更新屏幕的一部分,而不是整个区域。 pygame.display.update()pygame.display.flip() 的优化版本,适用于软件显示,但不适用于硬件加速显示。

【讨论】:

【参考方案2】:

创建一个变量来存储当前颜色:

currentColor = (255,255,255) # or 'white', since you created that value

background = input("What color would you like?: ")
if background == "red":
    currentColor = red # The current color is now red

在循环中:

while running:
    for i in pygame.event.get():
        if i.type == pygame.QUIT:
            running = False
            pygame.quit()

    screen.fill(currentColor) # Fill the screen with whatever the stored color is. 

    pygame.display.update() # Refresh the screen, needed whatever the color is, so don't remove this

所以现在,当您需要重新着色屏幕时,只需将 currentColor 更改为您需要的任何颜色,屏幕就会自动变为该颜色。 示例:

if foo:
    currentColor = (145, 254, 222)
elif bar:
    currentColor = (215, 100, 91)

顺便说一句,我认为将颜色存储为元组而不是列表更好,例如 red = (255, 0, 0)

此外,除了循环之外,您不需要 pygame.display.update(或翻转)。这个函数的作用是获取每个绘制项的最新形状/值并将其推送到屏幕上,因此您只需将其作为循环中的最后一项,因此它会显示所有内容。

【讨论】:

【参考方案3】:

下次您更新显示时,它将重绘为红色。加pygame.display.update()

background = input("What color would you like?: ")
if background == "red":
    screen.fill(red)
    pygame.display.update()

或者,您可以在(有条件地)更改背景颜色之后将pygame.display.flip() 移动到。

另见Difference between pygame.display.update and pygame.display.flip

【讨论】:

以上是关于Pygame:如何更改背景颜色[重复]的主要内容,如果未能解决你的问题,请参考以下文章

SwiftUI 2.0如何更改表单部分的背景颜色[重复]

尝试简单的 QPushButton 背景颜色更改 [重复]

如何在不刷新页面的情况下“连续”更改背景颜色[重复]

用我选择的颜色更改按钮背景颜色[重复]

如何更改导航选项卡的背景颜色[重复]

如何在html对象元素中更改svg位置的背景颜色[重复]