我有一個功能,可以循環顯示正在運行的過程。當過程完成時,函數再次以不同的值被調用(開/關),並且Label
變爲✓。如果我只有threadspawner()
的幾條線索開球,那麼他們完成罰款並將label
更改爲✓。如果我在同一時間開始很多線程(如12),那麼線程完成得很好,但一個或兩個標籤的旋轉輪有時不會變爲✓。轉輪功能並不總是退出
請注意,在下面的示例中,我無法讓加載程序停止並更改爲✓。也許這是即時通訊的一部分,但在我的代碼中,它切換得很好。
我應該不同地表示加載輪還是以不同的方式調用加載程序('off')?
我試着對每個線程使用全局變量,並在線程啓動時將其設置爲True,然後在線程結束時將其設置爲關閉。這隻適用於如果我更新加載器循環中的變量以獲取新值,這意味着我必須爲每個線程創建一個不同的加載函數,這是很多額外的代碼。我嘗試使用while
循環而不是if
,但它沒有改變。
我想爲每個線程運行的旋轉輪使用相同的加載函數。如果這不是最好的方法,請指出正確的方向。
from tkinter import *
import time
import threading
main = Tk()
def threadspawner():
global var1
global var2
print(var1)
if var1.get() == 2:
thread1 = threading.Thread(target=lambda: loader(lbl1, 'on')) #<-- starts the spinning wheel to show that something is happening
thread1.start()
time.sleep(1) #start doing stuff here
loader(lbl1, 'off') #<-- Turns off the spinning wheel
thread1.join()
if var2.get() == 2:
thread2 = threading.Thread(target=lambda: loader(lbl1, 'on')) #<-- starts the spinning wheel to show that something is happening
thread2.start()
time.sleep(2)
loader(lbl2, 'off')#<-- Turns off the spinning wheel
thread2.join()
var1 = IntVar()
chk1 = Checkbutton(main, text='process1', onvalue=2, offvalue=0, variable=var1)
chk1.grid(row=1)
lbl1 = Label(main, text='')
lbl1.grid(row=1, column=1)
var2 = IntVar()
chk2 = Checkbutton(main, text='process2', variable=var2)
chk2.grid(row=2)
lbl2 = Label(main, text='')
lbl2.grid(row=2, column=1)
strt = Button(main, text='Start', command=lambda: threading.Thread(target=lambda: threadspawner()).start())
strt.grid(columnspan=2)
def loader(label, switch):
global lbl1
global lbl2
#im using images for my program but you do not have them so I use keyboard entries below to represent
#img = PhotoImage(file='icons\\wheel.gif', format="gif -index 0")
#img1 = PhotoImage(file='icons\\wheel.gif', format="gif -index 1")
#img2 = PhotoImage(file='icons\\wheel.gif', format="gif -index 2")
if switch == 'off':
label['text'] = '✓'
return
if switch == 'on':
print('starting loop')
if switch == 'on':
label['text'] = '/'
time.sleep(.1)
if switch == 'on':
label['text'] = '-'
time.sleep(.1)
if switch == 'on':
label['text'] = '\\'
time.sleep(.1)
if switch == 'on':
loader(label, 'on')
main.mainloop()
這裏似乎沒有任何東西可以保證你打開*之後關閉微調器*。 – user2357112
當線程啓動時變量'on'以及變量'off'結束然後更新加載程序循環中的變量是唯一可靠的方法嗎? – sidnical
你爲什麼從單獨的線程關閉它?在你等待另一個線程完成之前,你爲什麼要關閉微調器? – user2357112