Как мне заставить мою метку ADC_Val_Var обновлять значение, используя .after() в моем графическом интерфейсе

Проблема, с которой я сталкиваюсь, заключается в том, что графический интерфейс определяет значение потенциометра, но когда я поворачиваю потенциометр, значение никогда не обновляется даже после прохождения секунды. Я использую рамку внутри окна сбоку от холста. Проблема начинается со значения #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()

Я попытался использовать поток, я подумал, что если после будет отложено, это поможет ему работать.

Попробуйте уменьшить код до минимальный воспроизводимый пример. Кажется, много кода, не связанного с заданным вопросом.

Bryan Oakley 22.03.2022 20:52

Где вы на самом деле читаете значение потенциометра. Я вижу, вы пытаетесь прочитать переменную с именем value, но не там, где вы ее установили.

scotty3785 22.03.2022 22:46

Пожалуйста, обрежьте свой код, чтобы было легче найти вашу проблему. Следуйте этим рекомендациям, чтобы создать минимальный воспроизводимый пример.

Community 23.03.2022 04:44
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
3
28
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Проблема заключалась в том, что я не включил фрейм в функцию, содержащую .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)  
'''

Другие вопросы по теме