我有一个循环旋转轮gif的功能来显示正在运行的过程。当该过程结束时,使用不同的值(开/关)再次调用该函数,并将aM
更改为✓。如果我只有Label
开始的几个线程,那么它们就完成了,并将threadspawner()
更改为✓。如果我同时开始很多线程(如12),那么线程就会很好,但是一个或两个标签的旋转轮有时不会改为✓。
请注意,在下面的示例中,我无法让加载程序停止并更改为✓。也许这是我搞砸的地方的一部分,但在我的代码中它转换得很好。
我应该以不同的方式表示负载轮还是以不同的方式调用加载器(' off')?
我尝试为每个线程使用全局变量,并在线程启动时将其设置为True,然后在线程结束时将其设置为off。这只有在我更新加载器循环中的变量以获取新值时才有效,这意味着我必须为每个线程创建一个不同的加载器函数,这个函数有很多额外的代码。我尝试使用label
循环代替while
,但它没有改变任何内容。
我想为每个螺纹运行的纺车使用相同的装载功能。如果这不是最好的方法,请指出我正确的方向。
if
答案 0 :(得分:1)
你正在做的问题是switch
是一个局部变量,所以当loader
函数启动时,微调器就会启动,但是当它停止时,{{1}传递给循环加载器函数链的参数仍为switch
,因此即使标签设置为'on'
,文本也会立即重置以继续加载动画;当使用参数'✓'
调用loader函数时,'off'
变量在该函数调用的本地范围内仅具有值switch
。
快速而又脏的修复方法是创建一个新的全局变量,该变量可用于阻止加载器函数永远调用自身。这有很多问题,例如一次只允许一个微调器。
'off'
但是,我建议使用类更简洁的方法。 (有一些未经测试的注释建议将其转换为使用图像而不是文本)。另外,你不能安全地在主线程之外进行tkinter调用,所以虽然这不是你问的原始问题,但我使用了global_switch = 'off'
def loader(label, switch):
global lbl1, lbl2, global_switch
if not switch==None:
global_switch = switch
if global_switch == 'off':
....
if global_switch == 'on':
....
loader(label, None)
main.mainloop()
的{{1}}方法来代替线程和root
s。
以下是我建议的解决方案:
after
注意:我还在代码中做了一些其他的小改动。