繁体   English   中英

ttk.treeview图表上每2秒输出三次的数据不是逐行打印的-第三次后仅一次打印

[英]Data outputted three times after every 2 seconds isn't being printed line by line on ttk.treeview chart-only printed in one burst after the third time

这是我目前拥有的简化版本:

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 = str(j)
                j = j + 5

                time.sleep(2)

                values = [time, a, b]
                print(values)
                Etable.insert('', 'end', values=values)

runningbtn = Button(root,command=run,text="Run")
runningbtn.grid(row=4,column=0,padx=13,pady=13)

Elist=['Time','Parameter1','Parameter2']
Etable=ttk.Treeview(root,column=Elist,show='headings',height=7)
for d in Elist:
    Etable.heading(d,text=d.title())
Etable.grid(row=5,column=0,padx=7,pady=7,columnspan=3)

我希望我从机器上读取的数据每 2 秒在表上打印三次,我想我相应地将表的值放在循环下。

取而代之的是,数据会累积起来,然后在六秒后立即打印在表格上。 我试过为它写一个单独的循环,重新排列值块的位置,重写循环并调试它,但数据一直在一次突发中输出,有什么提示吗?

Tk 要求定期发布和处理事件。 当您移动鼠标时,窗口系统将生成许多消息,这些消息排队等待 Tk 进行事件处理。 如果由于任何原因您未能处理这些,您的应用程序将“挂起”并且用户将看不到 UI 更新。 其中大部分由mainloop()方法处理,该方法不断等待事件,并在收到事件后立即处理它们。

你有上面两个问题。 您可能正在从串行端口 ( s.read(10) ) 读取数据。 这是一个阻塞调用。 您的线程将被挂起,直到串行端口上有 10 个字节可用。 在等待这些字节时,无法处理任何事件,因为您的应用程序线程已挂起。 为避免这种情况,要么在另一个线程上执行读取并在准备就绪时将结果发布到主 UI 线程,要么使用非阻塞读取。 例如测试s.inWaiting()如果这是一个 pyserial object 并且只有在所有 10 个字节都可用时才读取。

第二个问题是不要在 Tkinter 程序中使用 thread.sleep。 相反,将活动分成两部分并使用 Tkinter after()方法调用第二部分。 这会将一个事件排队,以特定的时间间隔处理,然后运行您指定的代码。 发生这种情况时,所有其他事件将继续处理,从而使您的应用程序响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM