Это проблема более крупной программы по зарядке и разрядке суперконденсаторов. Функция CELL_DISCHARGE — это функция, которая, как следует из названия, разряжает ячейки подключенных суперконденсаторов. В функции окно графического интерфейса зависает после нескольких вызовов
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
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*******************************************************************
for countdown in range(180,0,-1):
progress["value"] = 180 - countdown
CELL_DISCHARGE_frame.update_idletasks()
print(str(countdown) + ": 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
time.sleep(1)
Я попробовал использовать многопоточность для решения этой проблемы, поскольку уже видел это предложение, однако программа ведет себя не так, как ожидалось. С добавлением потоков код выглядит следующим образом:
import threading
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)
# Create a progress bar
progress = ttk.Progressbar(CELL_DISCHARGE_frame, orient="HORIZONTAL", length=180, mode="determinate")
progress.grid(row=1, column=0, pady=10)
progress["maximum"] = 180 # 180 seconds = 3 minutes
# Create the label separately from the grid layout call
voltage_label = ttk.Label(CELL_DISCHARGE_frame, text="Voltage: -- VDC")
voltage_label.grid(row=2, column=0, pady=10)
def discharge_process():
print("cell discharge for 3 minutes")
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
my34970A.write("ROUT:OPEN (@302,304,306,308,310,312,314,316,318)") # unaffected / set to discharge
my34970A.write("ROUT:CLOS (@201,203,205,207,209,211,213,215,217,219)") # affected / set for in circuit
my34970A.write("ROUT:CLOS (@301,303,305,307,309,311,313,315,317,319)") # affected / set for in circuit
# Loop for 180 seconds (3 minutes) with progress updates
for countdown in range(180, 0, -1):
print(f"{countdown}: Seconds Remaining - initial discharge")
# Update the progress bar
progress["value"] = 180 - countdown
CELL_DISCHARGE_frame.update_idletasks() # Force update the window
max_range = Num_samples + 101
for t in range(101, max_range, 1):
code = 200 + t
print(code)
# Measure voltage
my34970A.write('MEAS:VOLTAGE:DC? AUTO, DEF, (@' + str(t) + ')')
voltage = float(my34970A.read())
print(f"Voltage for Channel {t} = {voltage:.2f} VDC")
# Update the voltage label in the GUI
voltage_label.config(text=f"Voltage: {voltage:.2f} VDC")
CELL_DISCHARGE_frame.update_idletasks() # Force update the window
if msvcrt.kbhit(): # Check for keyboard hit
ASCII_in = ord(msvcrt.getche())
if ASCII_in == 120: # If 'x' is pressed, break the loop
break
time.sleep(1) # Wait for 1 second before next iteration
# Run the discharge process in a separate thread
discharge_thread = threading.Thread(target=discharge_process)
discharge_thread.start()
После добавления этого изменения я ожидал, что программа запустит разрядку в отдельном потоке из графического пользовательского интерфейса, но при этом разрядка_процесса выполняется в отдельном потоке и продолжаются следующие шаги программы. . Как мне лучше реализовать многопоточность или вместо этого использовать обработчик событий? Это решение также должно будет работать для вызовов нескольких других функций на протяжении всего процесса зарядки и разрядки.
Это проблема более крупной программы по зарядке и разрядке суперконденсаторов. Функция CELL_DISCHARGE — это функция, которая, как следует из названия, разряжает ячейки подключенных суперконденсаторов. В функции окно графического интерфейса зависает после нескольких вызовов [code] CELL_DISCHARGE_frame.update_idletasks() [/code] Это вся функция: [code]def CELL_DISCHARGE():
print("cell discharge for 3 minutes") #3min is for test 10 min for live 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******************************************************************* for countdown in range(180,0,-1): progress["value"] = 180 - countdown CELL_DISCHARGE_frame.update_idletasks()
print(str(countdown) + ": 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 time.sleep(1) [/code] Я попробовал использовать многопоточность для решения этой проблемы, поскольку уже видел это предложение, однако программа ведет себя не так, как ожидалось. С добавлением потоков код выглядит следующим образом: [code]import threading
my34970A.write("ROUT:OPEN (@202,204,206,208,210,212,214,216,218)") # unaffected / set to discharge my34970A.write("ROUT:OPEN (@302,304,306,308,310,312,314,316,318)") # unaffected / set to discharge my34970A.write("ROUT:CLOS (@201,203,205,207,209,211,213,215,217,219)") # affected / set for in circuit my34970A.write("ROUT:CLOS (@301,303,305,307,309,311,313,315,317,319)") # affected / set for in circuit
# Loop for 180 seconds (3 minutes) with progress updates for countdown in range(180, 0, -1): print(f"{countdown}: Seconds Remaining - initial discharge")
# Update the progress bar progress["value"] = 180 - countdown CELL_DISCHARGE_frame.update_idletasks() # Force update the window
max_range = Num_samples + 101 for t in range(101, max_range, 1): code = 200 + t print(code)
# Measure voltage my34970A.write('MEAS:VOLTAGE:DC? AUTO, DEF, (@' + str(t) + ')') voltage = float(my34970A.read()) print(f"Voltage for Channel {t} = {voltage:.2f} VDC")
# Update the voltage label in the GUI voltage_label.config(text=f"Voltage: {voltage:.2f} VDC") CELL_DISCHARGE_frame.update_idletasks() # Force update the window
if msvcrt.kbhit(): # Check for keyboard hit ASCII_in = ord(msvcrt.getche()) if ASCII_in == 120: # If 'x' is pressed, break the loop break
time.sleep(1) # Wait for 1 second before next iteration
# Run the discharge process in a separate thread discharge_thread = threading.Thread(target=discharge_process) discharge_thread.start() [/code] После добавления этого изменения я ожидал, что программа запустит разрядку в отдельном потоке из графического пользовательского интерфейса, но при этом разрядка_процесса выполняется в отдельном потоке и продолжаются следующие шаги программы. . Как мне лучше реализовать многопоточность или вместо этого использовать обработчик событий? Это решение также должно будет работать для вызовов нескольких других функций на протяжении всего процесса зарядки и разрядки.
Когда я подключаюсь к удаленному серверу с помощью ноутбука с Ubuntu, scp зависает, команда экрана зависает, htop зависает, когда я набираю Pipenv, оболочка зависает. Однако, когда я использую свой ноутбук с Windows с теми же учетными данными, я...
У меня проблемы с графическим интерфейсом, над которым я работаю. Идея состоит в том, чтобы иметь список сигналов дерева и иметь возможность перетаскивать их на сюжет. В конечном итоге наличие длинного списка сигналов, нескольких графиков и т. Д....
Окно Tkinter зависает после увеличения ширины строки. Я пробовал несколько раз, и экран всегда зависает. если я использую меньшую ширину, это работает. однако толщина некоторых линий отличается друг от друга.
если для параметра...
У меня есть приложение, которое собирает сигналы Wi-Fi и Bluetooth и отображает их на метке в RecycleView. При нажатии кнопки «Начать сканирование» мы собираем данные с устройства Android и обновляем Label.text. Затем сканирование выполняется с...
Справочная информация: у меня есть самоподписанный сертификат SSL для локального сервера, использующего мобильную точку доступа. Я запускаю этот сервер wss://, используя Ubuntu, поскольку первый клиент находится на компьютере с Windows. Второй...