1
votes

Comment syntaxe: renvoyer des instructions break et continue à partir d'une fonction?

Avec cette question, je remets en question toute la syntaxe et peut-être que ce n'est pas possible mais on y va :)

Je lance une fenêtre pygame. Maintenant, j'ai beaucoup de code dans cette boucle while pygame. Par conséquent, je veux créer des fonctions.

Cependant, le code que je souhaite créer en tant que fonction contient des instructions continue et break . Si je veux retourner break ou continuer à partir d'une fonction statique, il est évidemment dit "U stupid? Continue / Break est en dehors d'une boucle"

Ma question principale ici: comment concevriez-vous / résoudriez-vous cela d'une meilleure manière?

Voici à quoi ressemble mon code (plus ou moins):

        pygame.init()

        while True:
            for event in pygame.event.get():
                if event.type == KEYDOWN:
                    pyEvents(event)

             ... # ridiculously long code

             # My dream function
             result = myFunction(camera, master)

             if result == break:
                 break
             elif result == continue:
                 continue

        def myFunction(camera, master):
             (grabbed, frame0) = camera.read()
             if not grabbed:
                return break # Error: outside a loop

             frame1 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY)
             frame2 = cv2.GaussianBlur(frame1, gaussianBlurKSize, 0)

             if master is None:
                master = frame2
                return continue, master # Error: outside a loop

             return frame2

C'est ce que je veux atteindre:

        pygame.init()

        while True:
            for event in pygame.event.get():
                if event.type == KEYDOWN:
                    pyEvents(event)

             ... # ridiculously long code

             # A small example code snippet that I need as a function
             (grabbed, frame0) = camera.read()
             if not grabbed: # End of feed
                break

             frame1 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY)
             frame2 = cv2.GaussianBlur(frame1, gaussianBlurKSize, 0)

             if master is None:
                master = frame2
                continue


2 commentaires

Vous pouvez renvoyer des entiers comme 1-break, 2-continue, etc. Vous pouvez renvoyer des chaînes comme "break" puis vérifier la réponse.


tu as raison. semble assez facile


3 Réponses :


1
votes

Vous pouvez lever une exception dans la fonction. Dans votre boucle, vous pouvez utiliser une construction try-except. Peut-être que ce lien est utile: https://realpython.com/python-exceptions/


0 commentaires

3
votes

il suffit de créer une variable booléenne globale :

def myFunction():
    global running
    if you want to break the loop:
        running = False

et si vous voulez rompre la boucle, définissez running sur False :

running = True
while running:
    # your code goes here


0 commentaires

1
votes

Et quelque chose comme ça?

pygame.init()

while True:
    for event in pygame.event.get():
        if event.type == KEYDOWN:
            pyEvents(event)

        ... # ridiculously long code

        # My dream function
        frame2, master, result = myFunction(camera, master)

        if result == 'break':
            break
        elif result == 'continue':
            continue

def myFunction(camera, master):
    (grabbed, frame0) = camera.read()

    result = None

    if not grabbed:
        return None, None, 'break'

    frame1 = cv2.cvtColor(frame0, cv2.COLOR_BGR2GRAY)
    frame2 = cv2.GaussianBlur(frame1, gaussianBlurKSize, 0)

    if master is None:
        master = frame2
        return frame2, master, 'continue'

    return frame2, master, result


0 commentaires