如何让一段代码在整个函数中继续运行,同时允许其他代码运行?

How to have a piece of code continue to run throughout a function, while also allowing the other code to run?

提问人:Tel e 提问时间:11/9/2023 最后编辑:Tel e 更新时间:11/9/2023 访问量:53

问:

我的目标是,当在整个功能中随时按下按钮 A 或 B 时,它会切换到一个新进程(屏幕)。 我目前正在尝试使用线程,但它不起作用,老实说,我不确定如何让我的计划发挥作用。

def buttonB():
    if button_b.read():
        clear()
        play()

def buttonA():
    clear()
    howToPlay()

#Creates Main Title Screens
def main():
    t1= _thread.start_new_thread(buttonB, ())
    # Creates Game Ttile Screen
    clear()
    display.set_pen(GREEN)
    display.text("Blink of an Eye", 30, 25, 240, 5)
    display.update()
    time.sleep(2)
    clear()
    screen = 1
    # Switches between two "screens" 
    while True:
        #How To play Title Screen
        if screen == 1:
            display.set_pen(YELLOW)
            display.text('''How To Play: Press 'A' ''', 15, 35, 240, 4)
            display.update()
            time.sleep(1)
            clear()
            screen = 2
        
        # Play Title Screen
        elif screen == 2:
            display.set_pen(MAGENTA)
            display.text('''Play: Press 'B' ''', 15, 35, 240, 4)
            display.update()
            time.sleep(1)
            clear()
            screen = 1

请帮助我如何编写一段代码,允许代码不断检查函数以查看按钮 a 或 b 是否被按下,当它得到嘿,按下此按钮时,代码不再检查并移动到另一个函数。 我还想澄清一下,此代码具有其他函数,这些函数出于不同的原因使用相同的按钮,因此我只希望它在一个函数中工作,这样它就不会干扰其他代码。(我对代码的其余部分有同样的问题,但我认为我不会添加它,因为它是同一个问题)。

python 多线程 micropython raspberry-pi-pico thonny

评论


答:

2赞 iamdeedz 11/9/2023 #1

为此,您需要三个函数。一个用于检查是否按下了按钮 a。

def is_button_a_pressed():
    return True

另一个用于检查按钮 b 是否被按下。

def is_button_b_pressed():
    return False

我只是为这些返回了 True 或 False,因为我不知道您如何检查。效果相同,只是我手动更改了它。

最后,一个带有 while 循环的函数,它不断运行这两个函数,直到其中一个成功(返回 True)。

def check_buttons():
    global has_button_been_pressed
    while not has_button_been_pressed:
        if is_button_a_pressed():
            has_button_been_pressed = True
            how_to_play()

        if is_button_b_pressed():
            has_button_been_pressed = True
            play()

要在代码中实现这些函数,只需将函数传递到代码中即可完成!check_buttons_thread.start_new_thread

“完整”代码可能看起来像这样(显然它实际上不是完整的代码,但它是您需要的部分)。

has_button_been_pressed = False
def is_button_a_pressed():
    return True


def is_button_b_pressed():
    return False


def check_buttons():
    global has_button_been_pressed
    while not has_button_been_pressed:
        if is_button_a_pressed():
            has_button_been_pressed = True
            how_to_play()

        if is_button_b_pressed():
            has_button_been_pressed = True
            play()


def main():
    _thread.start_new_thread(check_buttons, ())
    # Creates Game Title Screen
    clear()
    display.set_pen(GREEN)
    display.text("Blink of an Eye", 30, 25, 240, 5)
    display.update()
    time.sleep(2)
    clear()
    screen = 1
    # Switches between two "screens" 
    while not has_button_been_pressed:
        if screen == 1:
            display.set_pen(YELLOW)
            display.text('''How To Play: Press 'A' ''', 15, 35, 240, 4)
            display.update()
            time.sleep(1)
            clear()
            screen = 2

            # Play Title Screen
        elif screen == 2:
            display.set_pen(MAGENTA)
            display.text('''Play: Press 'B' ''', 15, 35, 240, 4)
            display.update()
            time.sleep(1)
            clear()
            screen = 1

希望这有帮助!

评论

0赞 Tel e 11/9/2023
它有效!但它仍然会回到主要功能并播放屏幕。就像按下按钮时一样,它会闪烁正确的功能,但随后会返回主功能。(我添加了 def is_button_a_pressed(): if button_a.read(): return True def is_button_b_pressed(): if button_b.read(): return False)
0赞 iamdeedz 11/9/2023
我更新了代码。现在应该可以工作了!