如何让我的标签 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)
'''
我遇到的问题是 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)
'''