PythonTkinter:如何在没有崩溃的情况下在按钮中生成无限循环函数?

2024-09-28 22:01:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我曾尝试创建无限循环函数,但接口总是挂起而不执行任何操作。 我试着做了一个while循环,然后还使用了.after(),结果总是一样的。有人能帮我吗

def start_ping():
    
    while True:
        
        indices_tabla = tabla.get_children()
        
        for x_fila in range(0,len(indices_tabla)):
            
            celda_ip = tabla.item(indices_tabla[x_fila], 'values')[0]
            ping_equipo = ping(str(celda_ip), count=4)
                           
            msg = (celda_ip + '\n' +
                   '\n' +
                   str(datetime.now()) + '\n' +
                   '\n' +
                   str(ping_equipo) + '\n' +
                   '\n' +
                   '--------------------------------------------------' + '\n' + '\n')
            
            text_box.insert(tk.END, msg)

            text_box.yview(tk.END)
            
            celda_p_enviados =  int(tabla.item(indices_tabla[x_fila], 'values')[1])
            
            
            
            tabla.insert("", tk.END, text=str(lista_equipos[x_fila]),
                                 values=(str(lista_pings[x_fila]),celda_p_enviados+4,"0"))
            
            tabla.delete(indices_tabla[x_fila])
            

btn_start_ping = tk.Button(ventana, text="Start Ping!",
                       command= lambda: start_ping()).grid(row=2 , column=0)

Tags: textipitempingstarttkendvalues
1条回答
网友
1楼 · 发布于 2024-09-28 22:01:48

您可以使用after在给定的毫秒数之后调用函数。如果函数在延迟后使用after调用自身,则实际上创建了一个无限循环

步骤1,创建一个每秒调用另一个函数的函数:

def call_forever(func, *args):
    func(*args)
    root.after(1000, call_forever, *args)

步骤2,创建执行一次迭代的函数:

def do_something():
    <put whatever code you want here>

步骤3,调用第二个函数一次以启动循环:

call_forever(do_something)

如果希望函数能够跳出循环,请让内部函数返回布尔值,外部函数使用结果确定是否应继续

def call_forever(func, *args):
    should_continue = func(*args)
    if should_continue:
        root.after(1000, call_forever, func, *args)

def do_something():
    <put whatever code you want here>
    return True  # or return False if you want the loop to stop

相关问题 更多 >