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:如何更改背景颜色[重复]的主要内容,如果未能解决你的问题,请参考以下文章