如何在 Python Tkinter 中自动 运行 特定功能或无限次?

How to run Specific function automatically or infinite times in Python Tkinter?

我在 Python Tkinter 中有程序,我在其中制作了三行 10 个标签和一个开始按钮在它们下面。我已经使用 for 循环在标签中显示文本。

第一行标签只显示标题。

在 Label 的第二行我设置了条件,如果循环值模数等于零 (a%2==0) 它显示 Labels 文本 ON else OFF 并且这个条件在 Label 的第三行是相反的,如下所示和代码。

最后,在开始按钮上,我调用了一个函数,该函数遵循以下过程:如果循环变量值模数 2 等于 1,则在第二行标签上显示标签文本 OFF,否则为 ON。这个过程在第三行标签上是相反的。这个过程一直持续到我继续按下按钮。但是在这里,我希望当我按下开始按钮时它会自动保持更改文本。代码如下:

from tkinter import *
import tkinter as tk

win = Tk()
win.title("Label")
win.geometry("800x600+50+50")
win.config(bg='white')

label1=Label(win, text="Label Status Changer", font=("Calibri",24,"bold"), bg='white', borderwidth=1, relief="solid", padx=20, pady=20) #"flat", "raised", "sunken", "ridge", "solid", and "groove"
label1.pack(pady=(15,60))

list1=[]
list2=[]

lblframe = tk.Frame(win)
for a1 in range(10):
    pre1=Label(lblframe, text=("LBL",(a1+1)), font=("Calibri",12, "bold"), bg="white", borderwidth=1, relief="solid", padx=5, pady=2)
    pre1.grid(row=0, column=a1)

for l1 in range(10):
    if l1%2 ==0:
        list1.append(1)
    else:
        list1.append(0)

for l2 in range(10):
    if l2%2 ==1:
        list2.append(1)
    else:
        list2.append(0)

def mylabels():
    for a2 in range(10):
        if ( int(list1[a2])== 0 ):
            pre2=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
            pre2.grid(row=1, column=a2, sticky="nw")
            #list1.append(pre2.cget("text"))
        else:
            pre2=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
            pre2.grid(row=1, column=a2, sticky="nw")
            #list1.append(pre2.cget("text"))

    for a3 in range(10):
        if (int(list2[a3])== 0):
            pre3=Label(lblframe, text="OFF", font=("Calibri",12,"bold"), bg="white", fg="Green", borderwidth=1, relief="solid", padx=11, pady=1)
            pre3.grid(row=2, column=a3, sticky="nw")
            #list2.append(pre3.cget("text"))
        else:
            pre3=Label(lblframe, text="ON", font=("Calibri",12,"bold"), bg="white", fg="Red", borderwidth=1, relief="solid", padx=11, pady=1)
            pre3.grid(row=2, column=a3, sticky="nw")
            #list2.append(pre3.cget("text"))

lblframe.pack()

mylabels()

def statuschanger():    
    if(int(list1[1])%2==0):
        list1.clear()
        list2.clear()
        for l3 in range(10):
            if l3%2 ==1:
                list1.append(1)
            else:
                list1.append(0)

        for l4 in range(10):
            if l4%2 ==0:
                list2.append(1)
            else:
                list2.append(0)
        mylabels()
    elif(int(list1[1])%2==1):
        list1.clear()
        list2.clear()
        for l3 in range(10):
            if l3%2 ==0:
                list1.append(1)
            else:
                list1.append(0)

        for l4 in range(10):
            if l4%2 ==1:
                list2.append(1)
            else:
                list2.append(0)
        mylabels()

#Button1
button1=Button(win,text="Start",width=10,height=2, font=("Calibri",16,"bold"), bg="black",fg="white", command=statuschanger)
button1.pack(pady=(30,0))

win.mainloop()

运行 程序的输出

按下开始按钮时的输出

statuschanger()中使用win.after(100, statuschanger),它会重复函数。

def statuschanger():    
    if(int(list1[1])%2==0):
        list1.clear()
        list2.clear()
        for l3 in range(10):
            if l3%2 ==1:
                list1.append(1)
            else:
                list1.append(0)

        for l4 in range(10):
            if l4%2 ==0:
                list2.append(1)
            else:
                list2.append(0)
        mylabels()
    elif(int(list1[1])%2==1):
        list1.clear()
        list2.clear()
        for l3 in range(10):
            if l3%2 ==0:
                list1.append(1)
            else:
                list1.append(0)

        for l4 in range(10):
            if l4%2 ==1:
                list2.append(1)
            else:
                list2.append(0)
        mylabels()
    win.after(100, statuschanger) # run again after 100ms