使用tkinter函数“ 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)

让我知道。