【问题标题】:Python Tkinter: How to make Infinite Loop function in a button withouth crash?Python Tkinter:如何在按钮中制作无限循环功能而不会崩溃?
【发布时间】:2021-02-16 07:41:49
【问题描述】:

我尝试制作无限循环功能,但界面总是挂起而没有做任何事情。 我试着做一个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)

【问题讨论】:

  • ping() 可能需要几秒钟才能完成,因此它将阻止 tkinter 处理待处理的任务。使用线程运行start_ping()

标签: python loops button tkinter


【解决方案1】:

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

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

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

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

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

第三步,调用第二个函数一次开始循环:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 2014-01-31
    • 2018-09-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多