Python 名称或属性错误-经常必须使用全局变量,即使这样也不会';我不总是工作

Python 名称或属性错误-经常必须使用全局变量,即使这样也不会';我不总是工作,python,tkinter,Python,Tkinter,我正在尝试为这个倒计时计时器创建一个UI,我一直遇到python的问题,没有看到变量是在我正在创建的任何函数之外定义的。我试着使用globals,但有时也不起作用。有没有办法让函数认识到我在函数之外设置了变量 顺便说一句:即使我得到下面的代码来停止函数错误,它也可能不起作用,因为我还没有通过函数属性错误 示例错误: NameError:未定义名称“times” 名称错误:未定义名称“hr” NameError:未定义名称“小时” 变量hours、minutes和secs仅由timerstart函

我正在尝试为这个倒计时计时器创建一个UI,我一直遇到python的问题,没有看到变量是在我正在创建的任何函数之外定义的。我试着使用globals,但有时也不起作用。有没有办法让函数认识到我在函数之外设置了变量

顺便说一句:即使我得到下面的代码来停止函数错误,它也可能不起作用,因为我还没有通过函数属性错误

示例错误:

NameError:未定义名称“times”

名称错误:未定义名称“hr”

NameError:未定义名称“小时”


变量
hours
minutes
secs
仅由
timerstart
函数分配。但是,在其他代码尝试访问这些名称下的值之前,不会调用该函数。这就是为什么你会出错

要使事情正常工作,您需要重新组织代码。第一步是给出我在初始值上面命名的变量。文件顶部的
global
语句没有任何作用(
global
仅在函数中有用,但不禁止将其放在其他位置)。用
hours=0
之类的赋值替换这些语句,您会发现得到的
namererror
s更少

不过我怀疑你还有其他问题。您的
while
循环和对
timer.mainloop
的调用都相互冲突。它们都希望无限期地运行,但在任何给定时间只能运行一个。目前,您的计时器将在创建
tkinter
窗口之前完全停止计时

您可能应该找到适当的机制,从
tkinter
代码中对计时器进行回调,以减少计数器。您还需要更新显示剩余时间的逻辑,因为当前代码不会随着数字的变化而自动更新。我不太清楚
tkinter
,所以我将留给您(也许还有其他答案)来寻找最佳解决方案

global hours
global minutes
global secs
global loop
global counter
这是不正确的,没有任何作用
global
只应在函数内部使用,以告诉解释器在全局范围中查找您分配给的名称。要实际定义全局变量,只需将其设置为初始值

hours = 0
minutes = 0
secs = 0
loop = 0
counter = 0

另一方面,您可以在
global
语句中使用逗号,而不是在每一行上加一个逗号。我还担心无限循环会阻塞您的UI,但这是另一个问题。

它认为您的缩进非常不正确。是的,我复制了错误的缩进。我现在正试图解决这个问题。实际上,复制粘贴您的确切代码。我们中的一个人可以帮你格式化它。那样会容易些,我就这么做了。这就是我正在使用的atm。您将得到名称错误
hr未定义
,因为您根本没有将其设置为任何值,计算机进入while循环,不知道“hr”是什么。谢谢您的帮助。您得到了要停止的错误,但是关于您的aside语句,UI出现了,但是现在我遇到了一个问题,循环没有收到条目。我想这是另一个问题的问题。@user3763447我认为Tkinter实际上可能会自动处理将UI放在不同线程上的问题,所以在这种情况下,您应该没问题。请记住,对于未来的项目,有更多的Tkinter集成方法来实现这一点,而不是无限循环。我会记住这一点。此后,我一直无法弄清楚如何运行脚本的其余部分。所以我可能会提出一个新问题。谢谢你的回答。你上面的那个人得到了正确的答案,因为我实际上读了他的第一个答案,而且它起了作用。但是感谢您解决我在UI出现时遇到的第二个问题。它显示正确,但没有按计划工作。你说得对,我需要找到另一种让计时器工作的方法。
hours = 0
minutes = 0
secs = 0
loop = 0
counter = 0