0

Dans mon programme, il y a un calcul complexe qui nécessite que l'utilisateur évalue les résultats intermédiaires. Cela fonctionne bien dans une application de ligne de commande (à quoi ressemble mon code maintenant) car l'invite interactive interrompt l'exécution du programme jusqu'à ce que l'utilisateur tape Entrée. Le code de ligne de commande ressemble à ceci:Comment demander au code de procédure d'attendre que l'utilisateur saisisse une interface graphique avant de continuer?

def calculate(starting): 
    result1 = initial_calculation(starting) 
    user_input1 = input("What is your choice for " + result1 + "?") 
    result2 = calculate1(user_input1) 
    user_input2 = input("What is your choice for " + result2 + "?") 
    result2 = calculate2(user_input2) 
    #...etc 

Je voudrais fournir une interface plus intuitive que ce qui est possible avec la ligne de commande en utilisant une interface graphique et permettant à l'utilisateur de cliquer sur un bouton indiquant leur choix au lieu de . taper dans j'imaginer quelque chose comme ceci:

def do_something(starting): 
    result1 = initial_calculation(starting) 
    #wait for user to press a button indicating their choice? 
    result2 = calculate1(clicked_button.user_input1) 

    label.text("What is your choice for " + result1 + "?") 
    #wait for user again 
    result2 = calculate2(clicked_button.user_input2) 
    #...etc 

Est-il possible que je peux mettre en pause l'exécution du code de procédure qui fait les calculs, puis reprendre le code après que l'utilisateur clique sur un bouton? Je ne suis pas vraiment sûr de la façon d'élever ou de gérer des événements ici parce que normalement dans une interface graphique les callbacks de contrôle sont le point de départ de l'exécution du code, mais le code commence ailleurs et doit céder à l'interface graphique.

(Si cela fait une différence, je suis en utilisant Python et wxPython.)

Répondre

2

Solution générale:

flag = false; 

votre fil:

while (!flag); // wait here, consume cpu doing nothing 

fil IUG:

void OnInputEvent() { flag = true; } 
+0

C'est pas thread-safe * en général * - vous avez besoin d'une barrière de mémoire là-dedans quelque part pour s'assurer que l'écriture par le thread GUI avant 'flag = true' est visible pour le thread non-GUI * immédiatement * après' while (! flag); 'o Bien sûr, cela pourrait fonctionner, si vous avez de la chance, parfois, sur certaines plates-formes, peut-être comme python. –

+0

Les lectures de mémoire sont généralement threadsafe, n'est-ce pas? Je ne comprends pas votre point, s'il vous plaît élaborer. – Grozz

1

Je ne suis pas programmeur python, mais en général cela signifie que vous devrez attendre de temps en temps pour le thread GUI jusqu'à ce que le fil a reçu l'entrée de l'utilisateur.

Il peut y avoir une API pythonienne plus succincte, mais vous pouvez certainement utiliser raw python events.