首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在update ()函数中使用线程概念,而不是root。在()之后,这样它就不会扰乱窗口

如何在update ()函数中使用线程概念,而不是root。在()之后,这样它就不会扰乱窗口
EN

Stack Overflow用户
提问于 2020-10-06 19:39:30
回答 1查看 37关注 0票数 0

由于root. after(200,update),我的tkinter窗口感觉迟钝。我在tkinter窗口中显示了编码值和转速,扭矩值。我的问题是我的接口编码器作为中断和读取**转速和扭矩**值通过串行通信,所以我需要读取每200毫秒的值,我使用root. after(200,update).But它与编码值的问题(感觉粘滞在tkinter窗口)。

在谷歌了这么多线程可能是这个问题的解决方案后,我意识到.But我不知道如何使用线程的概念。所以我来这里寻求帮助。

提前谢谢。

以下是我的代码

代码语言:javascript
复制
import pigpio
import tkinter as tk
pos=0
rpm=0
torq=0
pow=0

    def callback(way): #interrupt event sense on pin no 17,18 for encoder
        global pos
        global st
        if st == 1:
            pos += way
            if pos >= 9999:
                pos = 9999
            if pos <= 0:
                pos = 0
            var.set(pos)
            
    def rpm_update():
        global rpm
       -------------------
       -------------------  # code for read values from RPM card
       var2.set(rpm)
    def torq_update():
        global torq
        ---------------------
        ---------------------  # code for read values from torque card
        var3.set(torq)
    def pow_update():
        global rpm,torq,pow
        ----------------       # code for power calculation
        -------------------
        var4.set(pow)
    def update():
        rpm_update()
        time.sleep(0.01)
        torq_update()
        time.sleep(0.01)
        pow_update()
        root.after(200,update)

    path="/home/pi/logo.png"
    root=tk.Tk()
    img=ImageTk.PhotoImage(Image.open(path))
    panel=tk.Label(root,image=img)
    panel.pack()
    panel.place(x=930,y=10,height=50,width=70)
    root.title("Dynalec")
    root.iconphoto(False,img)
    root.geometry("1000x600")
    
    -----------------------------
   ------------------------------      # tkinter window body 
    -----------------------------
    decoder=rotary_encoder.decoder(pi, 17, 18, callback)
    root.after(200,update)
    root.mainloop()
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-06 19:52:53

首先重写update(),如下所示:

代码语言:javascript
复制
def update():
    while True:
        rpm_update()
        time.sleep(0.01)
        torq_update()
        time.sleep(0.01)
        pow_update()
        time.sleep(0.2) # sleep for 200ms

然后用threading.Thread(target=update, daemon=True).start()替换root.after(200, update)

代码语言:javascript
复制
#root.after(200,update)
threading.Thread(target=update, daemon=True).start()

root.mainloop()

当然,您需要导入threading模块。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64225064

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档