Я работаю над графическим интерфейсом для программы, которая заряжает и разряжает суперконденсаторы. В функции CELL_DISCHARGE программа, похоже, обрабатывает одну итерацию обратного отсчета, но, похоже, не вызывает себя внутри функции after, как ожидалось. Программа переходит к следующему шагу. Это вся функция:
def CELL_DISCHARGE():
SCPI_instrument_frame.grid_forget()
CELL_DISCHARGE_frame.grid()
#cell discharge
global Chroma_address
global DAQ_address
rm = pyvisa.ResourceManager()
myChroma = rm.open_resource(Chroma_address)
my34970A = rm.open_resource(DAQ_address)
ttk.Label(CELL_DISCHARGE_frame, text="Cell discharge for 3 minutes").grid(row=0, column=0, pady=10)
voltage_label = ttk.Label(CELL_DISCHARGE_frame, text="Voltage: ")
voltage_label.grid(row=2, column=0, pady=10)
progress = ttk.Progressbar(CELL_DISCHARGE_frame, orient="horizontal", length=180, mode="determinate")
progress.grid(row=1, column=0, pady=10)
progress["maximum"] = 180
print("cell discharge for 3 minutes") #3min is for test 10 min for live
#debug
#time.sleep(3)
#myChroma = rm.open_resource(Chroma_address)
#Chroma_status = myChroma.query("*IDN?")
#print("Chroma Serial:" + Chroma_status)
#print("Line - 449")
#time.sleep(3)
#my34970A = rm.open_resource(DAQ_address)
DAQ_status = my34970A.query("*IDN?")
print("DAQ Serial:" + DAQ_status)
myChroma.write('CHAN 1') #discharge
myChroma.write('MODE CCL')
myChroma.write('CURR:STAT:L1 ' + str(Discharge_curr)) #CC, static, ch 1 (discharge), 1A
myChroma.write('LOAD ON')
my34970A.write("ROUT:OPEN (@202,204,206,208,210,212,214,216,218)") #unaffected / set to discharge
#debug*******************************************************************
my34970A.write("ROUT:OPEN (@302,304,306,308,310,312,314,316,318)") #unaffected / set to discharge
#debug*******************************************************************
my34970A.write("ROUT:CLOS (@201,203,205,207,209,211,213,215,217,219)") #affected / set for in circuit
#debug*******************************************************************
my34970A.write("ROUT:CLOS (@301,303,305,307,309,311,313,315,317,319)") #affected / set for in circuit
#debug*******************************************************************
def countdown(count):
if count > 0:
progress["value"] = 180 - count
CELL_DISCHARGE_frame.update_idletasks()
print(str(count) + ": Seconds Remaining - initial discharge")
max_range = Num_samples + 101
for t in range(101,max_range,1):
code = 200 + (t)
print(code)
#serialcomm.write(str(code).encode())
my34970A.write('MEAS:VOLTAGE:DC? AUTO, DEF, (@' + str(t) + ')')
voltage = float(my34970A.read())
print("Voltage for Channel " + str(t) + " = " + str(voltage) + " VDC")
voltage_label.config(text="Voltage: " + str(voltage))
CELL_DISCHARGE_frame.update_idletasks()
if msvcrt.kbhit():
ASCII_in = ord(msvcrt.getche())
if ASCII_in == 120:
break
CELL_DISCHARGE_frame.after(1000, countdown, count -1)
#time.sleep(1)
countdown(180)
Изначально это было частью проблемы, из-за которой окно графического интерфейса зависало из-за функции time.sleep. С тех пор функция была закомментирована и заменена другой функцией, которая вызывает себя каждую секунду, а не переходит в режим ожидания. Я ожидал, что программа будет вести обратный отсчет от 180 и предоставлять обновления каждую секунду, но, как упоминалось ранее, она обрабатывает только одну итерацию и переходит к следующему шагу. Я создал отдельный скрипт, который в основной программе работает идеально, как я и ожидал:
Я работаю над графическим интерфейсом для программы, которая заряжает и разряжает суперконденсаторы. В функции CELL_DISCHARGE программа, похоже, обрабатывает одну итерацию обратного отсчета, но, похоже, не вызывает себя внутри функции after, как ожидалось. Программа переходит к следующему шагу. Это вся функция: [code]def CELL_DISCHARGE():
print("cell discharge for 3 minutes") #3min is for test 10 min for live #debug #time.sleep(3) #myChroma = rm.open_resource(Chroma_address) #Chroma_status = myChroma.query("*IDN?") #print("Chroma Serial:" + Chroma_status) #print("Line - 449") #time.sleep(3) #my34970A = rm.open_resource(DAQ_address) DAQ_status = my34970A.query("*IDN?") print("DAQ Serial:" + DAQ_status) myChroma.write('CHAN 1') #discharge myChroma.write('MODE CCL') myChroma.write('CURR:STAT:L1 ' + str(Discharge_curr)) #CC, static, ch 1 (discharge), 1A myChroma.write('LOAD ON')
my34970A.write("ROUT:OPEN (@202,204,206,208,210,212,214,216,218)") #unaffected / set to discharge #debug******************************************************************* my34970A.write("ROUT:OPEN (@302,304,306,308,310,312,314,316,318)") #unaffected / set to discharge #debug******************************************************************* my34970A.write("ROUT:CLOS (@201,203,205,207,209,211,213,215,217,219)") #affected / set for in circuit #debug******************************************************************* my34970A.write("ROUT:CLOS (@301,303,305,307,309,311,313,315,317,319)") #affected / set for in circuit #debug******************************************************************* def countdown(count): if count > 0: progress["value"] = 180 - count CELL_DISCHARGE_frame.update_idletasks()
print(str(count) + ": Seconds Remaining - initial discharge") max_range = Num_samples + 101 for t in range(101,max_range,1): code = 200 + (t) print(code) #serialcomm.write(str(code).encode()) my34970A.write('MEAS:VOLTAGE:DC? AUTO, DEF, (@' + str(t) + ')') voltage = float(my34970A.read()) print("Voltage for Channel " + str(t) + " = " + str(voltage) + " VDC") voltage_label.config(text="Voltage: " + str(voltage)) CELL_DISCHARGE_frame.update_idletasks() if msvcrt.kbhit(): ASCII_in = ord(msvcrt.getche()) if ASCII_in == 120: break CELL_DISCHARGE_frame.after(1000, countdown, count -1) #time.sleep(1) countdown(180) [/code] Изначально это было частью проблемы, из-за которой окно графического интерфейса зависало из-за функции time.sleep. С тех пор функция была закомментирована и заменена другой функцией, которая вызывает себя каждую секунду, а не переходит в режим ожидания. Я ожидал, что программа будет вести обратный отсчет от 180 и предоставлять обновления каждую секунду, но, как упоминалось ранее, она обрабатывает только одну итерацию и переходит к следующему шагу. Я создал отдельный скрипт, который в основной программе работает идеально, как я и ожидал: [code]import tkinter as tk from tkinter import ttk
window.mainloop() [/code] Я также пробовал закомментировать функции msvcrt, но никаких изменений не произошло. Почему две программы ведут себя так по-разному?
Я создавал графический интерфейс на основе программы-конденсатора, используя библиотеку tkinter. Я использовал .after для процессов, требующих итераций. Я также попытался добавить кнопку пропуска на каждом шаге, однако она не пропускает текущую...
Я создавал графический интерфейс на основе программы-конденсатора, используя библиотеку tkinter. Я использовал .after для процессов, требующих итераций. Я также попытался добавить кнопку пропуска на каждом шаге, однако она не пропускает текущую...