Python 为什么我的中断回调在tkinter上变慢了

Python 为什么我的中断回调在tkinter上变慢了,python,tkinter,embedded,raspberry-pi3,interrupt-handling,Python,Tkinter,Embedded,Raspberry Pi3,Interrupt Handling,我正在使用中断方法将旋转编码器与raspberry Pi连接,并希望在tkinter标签上显示其值。 首先,我用main测试了我的中断回调函数,其中我的旋转编码器工作得很好,即计数器在编码器的一次旋转中=1000,但当我添加tkinter部分时,它会变慢,即计数器在编码器的一次旋转中=800。 我认为处理tkinter函数的方法存在一些问题,但无法跟踪问题。 这里我提供了两个不同的代码和输出 from RPi import GPIO from time import sleep import m

我正在使用中断方法将旋转编码器与raspberry Pi连接,并希望在
tkinter
标签上显示其值。
首先,我用main测试了我的中断回调函数,其中我的旋转编码器工作得很好,即计数器在编码器的一次旋转中=1000,但当我添加
tkinter
部分时,它会变慢,即计数器在编码器的一次旋转中=800。 我认为处理
tkinter
函数的方法存在一些问题,但无法跟踪问题。 这里我提供了两个不同的代码和输出

from RPi import GPIO
from time import sleep
import math
import Adafruit_MCP4725
dac=Adafruit_MCP4725.MCP4725(address=0x61)
a=22
b=23
GPIO.setmode(GPIO.BCM)
GPIO.setup(a,GPIO.IN)
GPIO.setup(b,GPIO.IN)

clkLastState=GPIO.input(a)

def my_callback(channel):
   global clkLastState
   global counter
   clkState=GPIO.input(a)
   if clkState != clkLastState:
           dtState=GPIO.input(b)
           if dtState != clkState:
              counter +=1
           else:
              counter -=1
           text=str(counter/2)
           print (text[0:-2])
   clkLastState=clkState
  # sleep(0.001)
   #finally:
counter=0
clkLastState=GPIO.input(a)
def main():
 global counter
 try:
#  GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
  while (1):
     print(counter/2)
     dac.set_voltage(int(counter/2))
     vlt=int(counter/2)/4096*5.0
     print(vlt)
     sleep(1)
 except KeyboardInterrupt:
  print("end it")
  GPIO.cleanup() 
GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
#input("enter anything")
if __name__=='__main__':
 # input("do") 
  main()
这是根据编码器规范工作的代码

955
955
956
956
957
957
958
958
959
959.0
1.170654296875
这里是tkinter的节目

from RPi import GPIO
from time import sleep
import tkinter as tk
a=22
b=23
GPIO.setmode(GPIO.BCM)
GPIO.setup(a,GPIO.IN)
GPIO.setup(b,GPIO.IN)
root=tk.Tk()
clkLastState=GPIO.input(a)

def my_callback(channel):
   global clkLastState
   global counter
   clkState=GPIO.input(a)
   if clkState != clkLastState:
           dtState=GPIO.input(b)
           if dtState != clkState:
              counter +=1
           else:
              counter -=1
           text=str(counter/2)
           print (text[0:-2])
           var.set(text)
   clkLastState=clkState
  # sleep(0.001)
counter=0
clkLastState=GPIO.input(a)
GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
print (counter)
var=tk.IntVar()
L1=tk.Label(root,bg="orange",fg="red",textvariable=var)
L1.pack()
# var.set(counter)
# root.after(500,main)
root.geometry("100x100")
root.mainloop()
#var=tk.IntVar()
#L1=tk.Label(root,bg="orange",fg="red",textvariable=var)
#L1.pack()  
#GPIO.add_event_detect(23,GPIO.BOTH,callback=my_callback)
input("enter anything")
GPIO.cleanup()

这是它的输出

759
760
761
762
763
763

有关更多详细信息,请参阅我的编码器数据表

您在第一个程序中反复调用了
dac。设置电压(…)
(无
tkinter
),但在有
tkinter
的程序中没有。这是造成差异的原因吗?@acw1668,根据中断回调函数的程序计数器递增和递减,因此在两种情况下,计数器应相同。只有第一个程序中的差异,我在
dac上设置计数器值。设置电压(…)
,在第二个程序中,我在
var.set(…)
。根据我的应用程序,我想在tkinter上显示计数器值,那么我是否以错误的方式使用tkinter?@Adee它似乎同时运行
tkinter.mainloop()
GPIO事件循环
会变慢。两者都使用
线程
,必须共享一个cpu。试着在自己的
进程中运行两个,这也是我的想法,但根据应用程序,我需要tkinter窗口,这就是为什么我选择raspberry pi,因为它功能强大,因为我的8位nuvoton微控制器与相同的编码器和其他中断事件完美配合。@stovfl,我没有收到你的评论“试着在自己的进程中运行任何一个”。你能给它一个小的演示吗。