问题描述
我正在尝试制作一个程序,当我按下空格键时,它会将背景颜色从黑色切换为白色。
有谁知道我的代码有什么问题:
import pygame,sys
clock = pygame.time.Clock()
wn_size = (800,600)
pygame.init()
screen = pygame.display.set_mode(wn_size)
bg_change = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
if bg_change:
bg_change = True
else:
bg_change = False
if bg_change == True:
screen.fill(255,255,255)
else:
screen.fill((0,0))
pygame.display.update()
clock.tick(60)
解决方法
似乎您在 screen.fill(255,255,255)
中添加了三个不同的参数而不是元组。
您可以通过添加另一层括号来解决此问题,例如:screen.fill((255,255))
。
if 语句应如下所示:
if bg_change:
screen.fill((255,255))
else:
screen.fill((0,0))
编辑:正如@JoeFerndz 提到的,您还应该将 if bg_change == True
更改为仅 if bg_change
,因为添加 == True
是多余的。
您可以使用基本的切换开关来更改值。
这里有两个选项:
1:布尔开关
bg_change = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
bg_change = not bg_change
if bg_change:
screen.fill((255,0))
2:将填充值设置为切换
t = 255 ^ 0
x = 0
x ^= t #x is set to 255 first. If you want to start with 0,comment this line
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
x ^= t
screen.fill((x,x,x))
这是它的工作原理:
>>> t = 255 ^ 0
>>> x ^= t
>>> x
255
>>> x ^= t
>>> x
0
>>> x ^= t
>>> x
255
每次必须切换时,值都会自动切换。所以你不必担心拨动开关。您正在使用 x 的值进行切换。
有关切换的更多选项,请参阅@Raymond Hettinger 在帖子 How to toggle a value in Python
中撰写的令人印象深刻的解决方案 ,错误在于以下几行:
if bg_change:
bg_change = True
else:
bg_change = False
这段代码实际上并没有做任何事情。如果 bg_change
为 True
,则设置为 True
,如果 bg_change
为 False
,则设置为 False
。你真正想做的是:
if event.key == pygame.K_SPACE:
if bg_change:
bg_change = False
else:
bg_change = True
您可以使用 not
运算符简化代码。 not
反转(切换)一个布尔变量:
if event.key == pygame.K_SPACE:
bg_change = not bg_change
fill
有一个参数,它可以是具有 RGB 颜色值的元组:
screen.fill(255,255)
screen.fill((255,255))
完整代码:
import pygame,sys
clock = pygame.time.Clock()
wn_size = (800,600)
pygame.init()
screen = pygame.display.set_mode(wn_size)
bg_change = False
running = True
while running:
for event in pygame.event.get():
if event.type == pygame.QUIT:
running = False
sys.exit()
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
bg_change = not bg_change
if bg_change == True:
screen.fill((255,0))
pygame.display.update()
clock.tick(60)