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