Я создавал графический интерфейс на основе программы-конденсатора, используя библиотеку tkinter. Я использовал .after для процессов, требующих итераций. Я также попытался добавить кнопку пропуска на каждом шаге, однако она не пропускает текущую функцию, а вместо этого вызывает следующую функцию, продолжая выполнять предыдущую функцию. Вот функция, которая активируется при нажатии кнопки пропуска:
def skip_cell_discharge():
global after_id_cell_discharge
if after_id_cell_discharge is not None: CELL_DISCHARGE_frame.after_cancel(after_id_cell_discharge)
EDLC_DOUBLE_CC_CHARGE()
Вот основная функция:
def countdown(count):
global Chroma_address
global DAQ_address
global after_id_cell_discharge
rm = pyvisa.ResourceManager()
myChroma = rm.open_resource(Chroma_address)
my34970A = rm.open_resource(DAQ_address)
voltage_label = ttk.Label(CELL_DISCHARGE_frame)
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
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:
EDLC_DOUBLE_CC_CHARGE()
after_id_cell_discharge = CELL_DISCHARGE_frame.after(1000, countdown, count -1)
else:
EDLC_DOUBLE_CC_CHARGE()
Строка after_id_cell_discharge = CELL_DISCHARGE_frame.after(1000, обратный отсчет, счетчик -1) управляет рекурсией. При вызове функция пропуска вызывает after.cancel(), которая должна отменить использование .after, но это не так. Почему?
Вот минимальный воспроизводимый пример:
def countdown(count):
progress = ttk.Progressbar(CELL_DISCHARGE_frame, orient="horizontal", length=180, mode="determinate")
progress.grid(row=1, column=0, pady=10)
progress["maximum"] = 180
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):
voltage = float(my34970A.read())
print("Voltage for Channel " + str(t) + " = " + str(voltage) + " VDC")
if msvcrt.kbhit():
ASCII_in = ord(msvcrt.getche())
if ASCII_in == 120:
EDLC_DOUBLE_CC_CHARGE()
after_id_cell_discharge = CELL_DISCHARGE_frame.after(1000, countdown, count -1)
else:
EDLC_DOUBLE_CC_CHARGE()
Подробнее здесь: https://stackoverflow.com/questions/792 ... s-expected
After_cancel в tkinter ведет себя не так, как ожидалось ⇐ Python
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Tkinter after функция ведет себя не так, как ожидалось. В чем причина?
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Discord py не отправляет сообщения при вызове из метода after из voice.play(... after=...)
Anonymous » » в форуме Python - 0 Ответы
- 30 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Короткий код для Bishop+Knight, который ведет себя не так, как ожидалось [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 22 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Короткий код для Bishop+Knight, который ведет себя не так, как ожидалось [закрыто]
Anonymous » » в форуме Python - 0 Ответы
- 18 Просмотры
-
Последнее сообщение Anonymous
-