You need to enable JavaScript to run this app. ttk.Treeview无法逐行显示间隔2秒的三次输出 仅循环结束后一次性加载
优惠活动
大模型
产品
解决方案
定价
更多

ttk.Treeview无法逐行显示间隔2秒的三次输出 仅循环结束后一次性加载

问题原因

tkinter 运行依赖单线程的事件循环机制,你代码里用的time.sleep(2)会直接阻塞整个主事件循环,期间界面的重绘、交互操作都会暂停,只有当run函数完全执行完毕后,才会一次性处理所有未完成的界面更新,所以你会看到数据批量出现。


解决方法

方案1:插入数据后强制刷新界面(快速修复)

每次调用Etable.insert之后,加一行root.update()强制主窗口刷新界面,就能立刻看到新插入的行,修改后的run函数代码如下:

def run(): 
    i = 1
    j = 0
    while i < 4:
        i = i+1 

        res1 = s.read(10)
        decodedres1 = res1.decode()
        a = decodedres1.replace("\r\n" , "") 

        res2 = s.read(50) 
        decodedres2 = res2.decode()
        b = decodedres2.replace("\r\n" , "") 
        
        # 注意:原变量名time和time模块重名,建议修改避免冲突
        time_str = str(j)
        j = j + 5

        time.sleep(2)

        values = [time_str, a, b]
        print(values)
        Etable.insert('', 'end', values=values)
        # 新增这行强制刷新界面
        root.update()

该方案属于快速修复,缺点是sleep期间界面还是无响应的,如果后续你的读取操作耗时更长,界面会有卡顿感。


方案2:用after方法替代sleep(规范写法,更推荐)

tkinter 内置的after方法可以实现定时触发任务,不会阻塞事件循环,界面全程保持响应,改写代码如下:

def insert_data(i=1, j=0):
    # 执行3次就退出
    if i >=4:
        return
    res1 = s.read(10)
    decodedres1 = res1.decode()
    a = decodedres1.replace("\r\n" , "") 

    res2 = s.read(50) 
    decodedres2 = res2.decode()
    b = decodedres2.replace("\r\n" , "") 
    
    time_str = str(j)
    values = [time_str, a, b]
    print(values)
    Etable.insert('', 'end', values=values)
    # 2000毫秒后调用自身,传入下一次的参数
    root.after(2000, insert_data, i+1, j+5)

# 按钮绑定的command改成insert_data即可
runningbtn = Button(root,command=insert_data,text="Run")

该方案不会阻塞主线程,界面全程可以正常拖拽、响应其他操作,是tkinter中做定时任务的标准实现。


内容的提问来源于stack exchange,提问作者throwaway

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 22:24:02