2017-08-11 143 views
0

首先,如果我问愚蠢的问题,我是一个绝对的初学者和抱歉。 我尝试为学校编写一个小程序。Python全局变量如果语句不起作用

想象一下带有三个应急开关的电机。一个“过热”,一个“断路器”和一个“手动”开关都会停止电机。

在程序中,开关是由tkinter按钮在一个小GUI中模拟的。 如果你按下按钮,它应该输出任何模拟的案例。 如果电机“停止”但再次按下按钮(或新按钮),则应显示“机器已停止”消息。 但该程序的最后一部分不起作用。

我已经了解到Python中的变量是默认的本地变量,所以我尝试将变量“triggered”定义为全局变量。但我可能犯了一些错误。 如果我运行该程序,会出现第一条消息(例如“过热!”),但再次按下该按钮时会丢失第二条消息“机器已停止”。

你能告诉我我的错在哪?我试图谷歌它,但我不知道什么是错的。有时很难阅读线索或教程,因为我不是说英语的母语。

请告诉我,如果有任何伪代码。 正如我所说我是一个绝对的初学者,但我努力学习它。

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

好像是你在使用Python 3.6 2.7工作确定,? – droravr

+0

我使用的是Visual Studio 2017,我认为支持Python 3.6作为默认版本。 – AlexN

回答

0

请注意,除了在Overheating你永远不会重新启用的打印允许它打印"Machine already stopped"

只需添加enablePrint()到其他两个选项else条款以及:

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

噢..这是有效的..谢谢!我试图只在第一次测试第一个按钮,但这似乎是问题所在。 – AlexN