【问题标题】:How to make a toggle button如何制作切换按钮
【发布时间】:2023-03-10 01:50:01
【问题描述】:

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

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

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, 0))

    pygame.display.update()
    clock.tick(60)

【问题讨论】:

  • 要切换开关,你不需要做` if bg_c​​hange: bg_c​​hange = True else: bg_c​​hange = False. Instead do bg_change = Not bg_c​​hange

标签: python pygame


【解决方案1】:

错误在以下几行:

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,255)

screen.fill((255, 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,255,255))
    else:
        screen.fill((0, 0, 0))

    pygame.display.update()
    clock.tick(60)

【讨论】:

    【解决方案2】:

    好像您在screen.fill(255,255,255) 中添加了三个不同的参数而不是一个元组。

    您可以通过添加另一层括号来解决此问题,例如:screen.fill((255,255,255))

    if 语句应如下所示:

        if bg_change:
            screen.fill((255,255,255))
        else:
            screen.fill((0, 0, 0))
    

    编辑:正如@JoeFerndz 所述,您还应该将if bg_change == True 更改为if bg_change,因为添加== True 是多余的。

    【讨论】:

    • 只需检查if bg_change 是否与== True 相同
    • 是的,我现在将编辑我的答案以包含它。谢谢你让我知道! @JoeFerndz
    【解决方案3】:

    您可以使用基本切换开关来更改值。

    这里有两个选项:

    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,255,255))
        else:
            screen.fill((0, 0, 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 中撰写的令人印象深刻的解决方案

    【讨论】:

    • Not 不是 Python。 Python 区分大小写。
    • 抱歉,应该是not 而不是Not :) 编辑了答案。谢谢你抓住那个。没想到我会在一句话中写出3个:)
    • 使用x 本身的值来使切换重载变量的实用程序。如果你真的想要这样的工具,我建议你写一个 Toggle 类。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-23
    • 2021-11-24
    • 2012-06-13
    • 1970-01-01
    相关资源
    最近更新 更多