Окно Tkinter GUI зависает, как обойти эту проблему?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Окно Tkinter GUI зависает, как обойти эту проблему?

Сообщение Anonymous »

Это проблема более крупной программы по зарядке и разрядке суперконденсаторов. Функция CELL_DISCHARGE — это функция, которая, как следует из названия, разряжает ячейки подключенных суперконденсаторов. В функции окно графического интерфейса зависает после нескольких вызовов

Код: Выделить всё

 CELL_DISCHARGE_frame.update_idletasks()
Это вся функция:

Код: Выделить всё

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

Подробнее здесь: https://stackoverflow.com/questions/790 ... -the-issue
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение
  • Когда я подключаюсь к удаленному серверу, scp зависает, команда экрана зависает, htop зависает [закрыто]
    Гость » » в форуме Linux
    0 Ответы
    158 Просмотры
    Последнее сообщение Гость
  • ПРОБЛЕМЫ ПРЕДУПРЕЖДЕНИЯ GUI PYTHON GUI
    Anonymous » » в форуме Python
    0 Ответы
    95 Просмотры
    Последнее сообщение Anonymous
  • Окно Tkinter зависает после увеличения ширины строки
    Anonymous » » в форуме Python
    0 Ответы
    7 Просмотры
    Последнее сообщение Anonymous
  • Kivy GUI зависает через 10 секунд
    Anonymous » » в форуме Python
    0 Ответы
    3 Просмотры
    Последнее сообщение Anonymous
  • Клиент Python GUI, который управляет приложением iOS с помощью самозаверяющего сертификата SSL, зависает/перестает обмен
    Anonymous » » в форуме Python
    0 Ответы
    22 Просмотры
    Последнее сообщение Anonymous

Вернуться в «Python»