如何让我的标签 ADC_Val_Var 在我的 GUI 中使用 .after() 更新值

How do I get my label ADC_Val_Var to update value using the .after() in my GUI

我遇到的问题是 GUI 拾取了电位器的值,但是当我转动电位器时,即使经过一秒钟,该值也不会更新。我在 canvas 的一侧使用 window 内的框架。问题始于#update adc 值。


#Code for RC5 operation below

i2c = busio.I2C(board.SCL, board.SDA)

adc = ADS.ADS1115(i2c)

chan0 = adc.read(0, 1)  # define channel on ads1115
chan2 = adc.read(1, 1)  # define channel for voltage sensor on battery1
chan3 = adc.read(2, 1)  # define channel for voltage sensor on battery2
chan4 = adc.read(3, 1)  # define channel for voltage sensor on generator

#define setup of program to run

def setup():
    global adc
    if (adc.read(0, 1)):
        adc = ADS.ADS1115(board.I2C())
    else:
        print("No correct I2C address found, \n"
              "Please use command 'i2cdetect -y 1' to check the I2C address. \n"
              "Program Exit. \n");
        exit(-1)
    global p
    GPIO.setmode(GPIO.BCM)  # declare the GPIO settings
    
    # set up GPIO pins
    GPIO.setup(17, GPIO.OUT)  # connected to pwm
    GPIO.setup(22, GPIO.OUT)  # connect to In2
    GPIO.setup(27, GPIO.OUT)  # connected to In1
    p = GPIO.PWM(17, 1000)  # creat PWM and set Frequence to 1KHz
    p.start(0)

def motor(adc):     #you stopped here
    value = adc
    if (value > -16384):  # turn clockwise
        GPIO.output(27, GPIO.HIGH)
        GPIO.output(22, GPIO.LOW)
        #print("Run")
        p.ChangeDutyCycle(95)
    elif (value < -16348):
        GPIO.output(27, GPIO.HIGH)
        GPIO.output(22, GPIO.LOW)
        #print("Run Slow")
        p.ChangeDutyCycle(75)
        

#motor adjusting loop

def loop():
    motor(value)
    time.sleep(1)

#adc readouts 

global value
global bat1
global bat2
global gen1
        
    
value = chan0  # read ADC from channel 0
bat1 = chan2  # read voltage sensor from channel 2
bat2 = chan3  # read voltage sensor from channel 3
gen1 = chan4  # read voltage sensor from generator


#begin code for gui

main = tk.Tk()
main.title('REGENERATOR')
main.geometry('800x800')    


        
main_Frame = Frame(main)
main_Frame.pack(fill=BOTH, expand=1)    

main_canvas = Canvas(main_Frame, width=780, height=780, scrollregion=(0, 0, 1200, 1200))
main_canvas.grid(row=0, column=0)

y_scroll = ttk.Scrollbar(main_Frame, orient=VERTICAL, command=main_canvas.yview)
y_scroll.grid(row=0, column=1, sticky='ns')

x_scroll = ttk.Scrollbar(main_Frame, orient=HORIZONTAL, command=main_canvas.xview)
x_scroll.grid(row=1, column=0, sticky='ew')

main_canvas.configure(xscrollcommand=x_scroll.set, yscrollcommand=y_scroll.set)

main_canvas.bind('<Configure>', lambda e: main_canvas.configure(scrollregion=main_canvas.bbox("all")))
    
            
#The following code is all for column 0 section 1 Monitor

frame0 = LabelFrame(main_canvas, text="Monitor", padx=5, pady=5, font=("Times", 20))
frame0.grid(row=0, column=0, padx=5, pady=5)

main_canvas.create_window((0,0), window=frame0)



#update adc value

var = tk.IntVar()

ADC_Val_var = Label(frame0, textvariable = var, width=10, height=2, bg="white", fg="black", font=("Times", 16))
ADC_Val_var.grid(row="2", column="1")

#update value function
def update_value(self):
    var.set(value)
    self.ADC_Val_var.config(textvariable=value)
    self.ADC_Val_var.after(1000, self.update_value) 



def destroy():
    p.stop()  # stops PWM
    GPIO.cleanup()

if __name__ == '__main__':  # program entrance
    
    setup()

    
    try:
        loop()
        
        
    except KeyboardInterrupt:  # press  ctrlc to end program
        destroy()
#threading.Thread(target=update_value).start()

update_value(main)
main.mainloop()

我试过使用线程,我想如果延迟了之后它会帮助它工作。

问题是我没有在包含 .after() 的函数中包含框架。

'''

#update value function
def update_value(): 
    var = tk.IntVar()
    ADC_Val_var = Label(frame0, textvariable=var, width=10, height=2, bg="white", fg="black", font=("Times", 16))
    ADC_Val_var.grid(row="2", column="1")
    v = R.value()
    var.set(v)
    ADC_Val_var.config(textvariable=v)
    ADC_Val_var.after(speed, update_value)  
'''