【问题标题】: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每 2 秒后输出 3 次的数据不会在 ttk.treeview 图表上逐行打印 - 仅在第三次后一次打印
【发布时间】:2021-10-17 16:56:47
【问题描述】:

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

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 秒在桌子上打印 3 次,我想我相应地将表格的值放在循环下。

相反,数据会累积起来,然后在 6 秒后一次性打印在表格上。我已经尝试为它编写一个单独的循环,重新排列值块的位置,重写循环并调试它,但是数据一直持续输出一次,有什么提示吗?

【问题讨论】:

  • 好的,很简单,不要在与tkinter相同的线程或进程中使用循环(while,for),而是使用.after()“loops”(或根据具体情况启动一个新线程)每次迭代需要多长时间)

标签: python tkinter pycharm python-3.9 issue-tracking


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-07-03
    • 1970-01-01
    • 2019-04-25
    • 2017-04-26
    • 1970-01-01
    • 2012-10-06
    • 1970-01-01
    • 2017-06-21
    相关资源
    最近更新 更多