Search code examples
python-3.xtkinterraspberry-piinterrupt-handlingpi

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


I am quite new to python and tkinter ,I am working on a project where i give demand to slave device through rotary encoder value and reading feedback value from slave devices through communication. I face issue when i use root.after () function . Any suggestion regarding proper use of root.after () function so that my interrupt routine not affected welcome heartly. Thank you. Here is my code.

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()

everything is working fine before root.after() function " root.after(1000,update) but i need it because i have to read slave values in every sec and update in gui screen.


Solution

  • Adding as a answer because long for comments, will remove soon.

    Try this out:

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

    Do let me know.