繁体   English   中英

If语句中的Python全局var不起作用

[英]Python global var in If statement doesn't work

首先,我是一个绝对的初学者,如果我问愚蠢的问题,对不起。 我尝试为学校编写一个小程序。

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

在程序中,这些开关是通过一个小的GUI中的tkinter按钮进行模拟的。 如果按下该按钮,它将输出模拟的任何情况。 如果电动机“已停止”,但再次按下了一个按钮(或一个新按钮),则将出现消息“机器已停止”。 但是该程序的最后一部分不起作用。

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

你能告诉我我的错在哪里吗? 我试图用谷歌搜索,但不知道出什么问题了。 有时,由于我不是英语母语者,因此很难阅读主题或教程。

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

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()

请注意,除了在“ 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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM