如何制作切换按钮

问题描述

我正在尝试制作一个程序,当我按下空格键时,它会将背景颜色从黑色切换为白色。

有谁知道我的代码有什么问题:

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_changeTrue,则设置为 True,如果 bg_changeFalse,则设置为 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)