2017-08-11 2 views
0

D'abord, je suis un débutant absolu et désolé si je pose des questions stupides. J'essaie de coder un petit programme pour l'école. Imaginez un moteur avec trois interrupteurs d'urgence.Python global var dans If déclaration ne fonctionne pas

Imaginez un moteur avec trois interrupteurs d'urgence. Un "surchauffeur", un "disjoncteur" et un interrupteur "manuel" qui arrêtent tous le moteur.

Dans le programme, les commutateurs sont simulés par des boutons tkinter dans une petite interface graphique. Si vous appuyez sur le bouton, il devrait sortir quel que soit le cas simulé. Si le moteur "s'est arrêté" mais qu'un bouton (ou un nouveau bouton) est à nouveau enfoncé, un message "Machine déjà arrêtée" doit apparaître. Mais cette dernière partie du programme ne fonctionne pas.

J'ai appris que les vars en Python sont locaux par défaut et j'ai donc essayé de définir le var "triggered" comme global. Mais j'ai probablement fait des erreurs. Si j'exécute le programme, le premier message (par exemple "Surchauffe!") Apparaît mais le deuxième message "Machine déjà arrêtée" est manquant quand on appuie à nouveau sur le bouton.

Pouvez-vous me dire où est ma faute? J'ai essayé de google mais je ne sais pas ce qui ne va pas. Parfois, il est difficile de lire des discussions ou des tutoriels parce que je ne suis pas anglophone.

Et s'il vous plaît dites-moi s'il y a un pseudo-code là-dedans. Comme je l'ai dit je suis un débutant absolu mais j'essaye de l'apprendre.

from tkinter import * 
import sys, os 

root = Tk() 
root.title("Control Panel") 
root.geometry("400x200") 
app = Frame(root) 
app.grid() 

# Vars can be used later 
overheat = False 
# Stops motor if temperature is too high 
circuitbreaker = False 
# Stops if current flow is too high 
manual = False 
# Stops when switch is triggered manually 
global triggered 
triggered = False 
# Returns True if one emergency unit has triggered 

def Button_Overheat(): 
    global triggered 
    if triggered == False: 
     triggered = True 
     print("Overheating!") 
     blockPrint() 
    else: 
     enablePrint() 
     print("Machine already stopped") 
     blockPrint 
    return 

button_overheat = Button(app, text = "Overheat", command = Button_Overheat) 
button_overheat.grid() 

def Button_CircuitBreaker(): 
    global triggered 
    if triggered == False: 
     print("Overload! Breaking Circuit...") 
     blockPrint() 
    else: 
     print("Machine already stopped") 
     blockPrint() 
    return 

button_cicuitbreaker = Button(app, text = "Circuitbreaker", command = Button_CircuitBreaker) 
button_cicuitbreaker.grid() 

def Button_Manual(): 
    global triggered 
    if triggered == False: 
     print("Machine was manually stopped") 
     blockPrint() 
     triggered = True 
    else: 
     print("Machine already stopped") 
     blockPrint() 
     return 

button_manual = Button(app, text = "Turn off manually", command = Button_Manual) 
button_manual.grid() 


def blockPrint(): 
    sys.stdout = open(os.devnull, 'w') 

def enablePrint(): 
    sys.stdout = sys.__stdout__ 

mainloop() 
+0

semble fonctionner ok sur 2.7, vous utilisez Python 3.6? – droravr

+0

J'utilise Visual Studio 2017, je pense que Python 3.6 est la version par défaut. – AlexN

Répondre

0

S'il vous plaît noter que les autres que dans Overheating vous ne re l'impression activée pour lui permettre d'imprimer "Machine already stopped".

Il suffit d'ajouter enablePrint() aux deux autres options else clauses ainsi:

def Button_CircuitBreaker(): 
    global triggered 
    if triggered == False: 
     print("Overload! Breaking Circuit...") 
     blockPrint() 
    else: 
     enablePrint() 
     print("Machine already stopped") 
     blockPrint() 
    return 


def Button_Manual(): 
    global triggered 
    if triggered == False: 
     print("Machine was manually stopped") 
     blockPrint() 
     triggered = True 
    else: 
     enablePrint() 
     print("Machine already stopped") 
     blockPrint() 
     return 
+0

Oh .. Ça marche .. Merci! J'ai essayé de tester le premier bouton seulement au début, mais cela semblait être le problème. – AlexN