使用 tkinter 函数“root.after”后旋转编码器值看起来很粘

Rotary encoder value looking sticky after using tkinter function " root.after"

我对 python 和 tkinter 很陌生,我正在做一个项目,我通过旋转编码器值向从设备发出请求,并通过通信从从设备读取反馈值。 我在使用 root.after () 函数时遇到问题。 任何有关正确使用 root.after () 函数以使我的中断例程不受影响的建议都受到热烈欢迎。 谢谢你。 这是我的代码。

import pigpio
import tkinter as tk
from PIL import ImageTk,Image
import time
from RPi import GPIO
import serial

i="*00T%"
j="*01T%"
s=serial.Serial(port='/dev/ttyS0',
                baudrate=9600,
                parity=serial.PARITY_NONE,
                stopbits=serial.STOPBITS_ONE,
                bytesize=serial.EIGHTBITS,
                timeout=1)

class decoder:           # class for decoding rotary encoder 
  def __init__(self, pi, gpioA, gpioB, callback):
      ----------
     ---------------
        ----------------

if __name__ == "__main__":

   import RPi.GPIO as GPIO
   import time
   import pigpio
   import tkinter as tk
   import board
   import busio
   rpm=0
   tor=0
   pow=0
   
   pi = pigpio.pi()
   st=1
   pos=0
   def callback(way):  # interrupt event sense on pin no 17,18

      global pos
      global st

      if st ==1:
        pos += way
      if pos >= 9999:
          pos=9999
        if pos <= 0:
          pos=0

        var.set(pos)
       
        print("pos={}".format(pos))
   def rpm_update():
     global rpm
     s.write(str.encode(i))
     print(i)
     time.sleep(0.2)
     if s.inWaiting():
      rpm=s.readline(s.inWaiting())
      rpm=rpm.decode('utf-8',errors='ignore')
      rpm=rpm[5:-1]
      print(rpm)

      var2.set(rpm)

   def tor_update():
     global tor
     s.write(str.encode(j))
     print(j)
     time.sleep(0.2)
     if s.inWaiting():
      tor=s.readline(s.inWaiting())
      tor=tor.decode('utf-8',errors='ignore')
      tor=tor[4:-1]
      print(tor)

     var3.set(tor)

   def pow_update():
    global rpm,tor,pow
    try:
     rpm=float(rpm)
     tor=float(tor)
    except ValueError:
     pass
    pow=int(rpm*tor/5252)
    var4.set(pow)

   def update(): 
     rpm_update()
     time.sleep(0.5)
     tor_update()
     time.sleep(0.5)
     pow_update()
     root.after(1000,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=195,y=10,height=50,width=80)
   root.title("Dynalec")
   root.geometry("500x600")
 
   {
    body of tkinter screen
   }
   decoder=decoder(pi, 17, 18, callback)
   root.after(1000,update)
   root.mainloop()

在 root.after() 函数之前一切正常 " root.after(1000,update) 但我需要它,因为我必须每秒读取从值并在 gui 屏幕中更新。

添加为答案,因为期待评论,将很快删除。

试试这个:

def update(): 
     root.after(500,rpm_update)
     root.after(500,tor_update)
     root.after(500,pow_update)
     root.after(1000,update)

一定要告诉我。