Я создавал графический интерфейс на основе программы-конденсатора, используя библиотеку 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
Программы на Python
-
Anonymous
1732025135
Anonymous
Я создавал графический интерфейс на основе программы-конденсатора, используя библиотеку 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()
Подробнее здесь: [url]https://stackoverflow.com/questions/79201084/after-cancel-in-tkinter-not-behaving-as-expected[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия