我想撰寫一個只有一個按鈕的程式,按下該按鈕后,程式將開始制作 3 個標簽,然后每 1 秒僅更改一次每個標簽的顏色。
它看起來很簡單,我撰寫了以下代碼:
import tkinter as tk
from time import sleep
def function():
mylist=list()
for i in range(3):
new_label=tk.Label(window,text='* * *',bg='yellow')
new_label.pack()
mylist.append(new_label)
print('First state finished')
sleep(1)
for label in mylist:
label.config(bg='red')
print('one label changed')
sleep(1)
window = tk.Tk()
window.geometry('300x300')
btn=tk.Button(window,text='start',command=function)
btn.pack()
tk.mainloop()
首先,應用程式看起來像這樣(沒關系):

其次它看起來像這樣(它不好,因為它在終端上列印但沒有更新標簽):

第三它看起來像這樣(最后應用程式必須看起來像這樣并且可以):

但是我需要看到當下的變化并因此使用睡眠。謝謝你們。
uj5u.com熱心網友回復:
我建議使用 tkinter 的 .after(delay, callback) 方法來設定顏色。
希望這是你想要的。
import tkinter as tk
def start():
global mylist
mylist = list()
for i in range(3):
new_label = tk.Label(window, text='* * *', bg='yellow')
new_label.pack()
mylist.append(new_label)
delay = 1000 # delay in seconds
for label in mylist:
# Additional delay so that next color change
# is scheduled after previous label color change
delay = 1000
schedule_color_change(delay, label)
def schedule_color_change(delay, label):
print("schedule color change for:", label)
label.after(delay, set_color, label)
def set_color(label):
print("setting color of:", label)
label.config(bg="red")
window = tk.Tk()
window.geometry('300x300')
btn = tk.Button(window, text='start', command=start)
btn.pack()
tk.mainloop()
uj5u.com熱心網友回復:
問題
問題是你的sleep(1),因為它是一個暫停當前執行緒執行一定秒數的函式,所以就像整個腳本都停止了
解決方案
解決辦法是用一個目標函式實體化Thread,呼叫start(),讓它開始作業。所以你必須使用timer執行緒中包含的,然后是執行緒模塊中的計時器(import threading)
在第一個“for”回圈中,洗掉你的 sleep(1) 并撰寫例如Time_Start_Here = threading.Timer (2, function_2),然后當然是 Time_Start_Here.start()開始。
start_time=threading.Timer(1,function_2)
start_time.start()
相反,您必須洗掉第二個“for”回圈并在將被呼叫的新函式中寫入里面的內容。接下來需要創建函式
def function_2():
for label in mylist:
label.config(bg='red')
label.pack()
print('one label changed')
uj5u.com熱心網友回復:
在Meritor 的指導下,我按照after方法撰寫了以下沒有 sleep 的遞回代碼:
import tkinter as tk
def recursive(i, listt):
lbl = listt[i]
if i >= 0:
lbl.config(bg='orange')
i -= 1
lbl.after(500, recursive, i, listt)
def function():
mylist = list()
for i in range(3):
new_label = tk.Label(window, text='* * *', bg='yellow')
new_label.pack()
mylist.append(new_label)
print('all label created')
# 2 is length of list minus 1
recursive(2, mylist)
window = tk.Tk()
window.geometry('300x300')
tk.Button(window, text='start', command=function).pack()
tk.mainloop()
很可能我的代碼沒有優化,因為它使用遞回,如果你知道更好的,請告訴我
uj5u.com熱心網友回復:
正如 Bryan Oakley 所說,睡眠使整個代碼進入睡眠狀態,因此您可以使用執行緒模塊中的計時器,而不是使用睡眠。
這應該有效:
import tkinter as tk
import threading
def start():
global mylist
mylist=list()
for i in range(3):
new_label=tk.Label(window,text='* * *',bg='yellow')
new_label.pack()
mylist.append(new_label)
start_time=threading.Timer(1,function)
start_time.start()
print('First state finished')
def function():
for label in mylist:
label.config(bg='red')
label.pack()
print('one label changed')
window = tk.Tk()
window.geometry('300x300')
btn=tk.Button(window,text='start',command=start)
btn.pack()
tk.mainloop()
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409453.html
標籤:
