Мне нужно знать, сталкивались ли вы когда-либо с замедлением или даже зависали при использовании текстового поля для отображения большого количества данных.
В моем случае я запускаю сценарий моделирования с использованием подпроцесса, и его стандартный вывод отображается в тексте.коробка.Текст может быть в мегабайтах.
Я попробовал две реализации:
1) Текстовое поле дожидается завершения симуляции (подпроцесса), прежде чем оно сможет отобразить данные стандартного вывода.Это сработало довольно хорошо.Но единственная проблема заключалась в том, что я хотел отображать данные стандартного вывода в реальном времени.
2) Я начал отображать данные в реальном времени. Здесь в текстовом поле легко отображались данные стандартного вывода для небольших процессов.Однако, когда я запускаю длинные скрипты симуляции, они застряли между ними.Я знаю, что выполнение сценария моделирования остановлено, поскольку соответствующие выходные файлы не были сгенерированы.Зависание экрана аналогично тому, которое мы наблюдаем в Windows.
О скрипте моделирования: это один скрипт, который может запускать многие другие дочерние процессы (по одному) с использованием других скриптов.
Пожалуйста, совет, если у вас есть какое-либо решение?Могу ли я использовать холст вместо текстового поля?это поможет?
Найдите функцию запуска, как показано ниже:
def run():
filename = str(run_file_name.get())
command.set("Running "+filename)
#Creating new Window to display output
t = Toplevel(root)
t.title('output Run Display')
t.geometry('800x1000-5+40')
t.state('normal')
little = Label(t, text="OUTPUT LOG").grid(column = 0, row = 0)
log = Text(t, state='disabled', width=115, height=150, wrap='none')
log.grid(row = 1, column = 0)
test=subprocess.Popen(filename,shell=True,stdout=subprocess.PIPE,stderr=subprocess.PIPE)# stderr=subprocess.PIPE)
#stdout
while True:
line_out = test.stdout.readline()
line_er = test.stderr.readline()
if line_out == "" and line_er == "":
break
else:
log['state'] = 'normal'
log.insert('end', line_out)
log.insert('end', line_er)
log['state'] = 'disabled'
print line_out
print line_er
t.update()
Основная цель - запустить подпроцесс и показать весь вывод в текстовом поле, следовательно, отделить пользователя от командыбыстрый интерфейс Замечание из моей попытки отладки: Когда я запустил тот же самый скрипт gui с примером скрипта (sample_script), который печатает номера от 1 до 5000, он работал нормально.Это означает, что поток сценария в порядке.Но есть одно существенное отличие между тестовой средой и моей реальной средой выполнения сценариев: это мой сценарий запуска подпроцесса (скажем: - script_1) на самом деле является родительским сценарием csh, который выполняет другие сценарии (скажем: - script1.1 и сценарий 1.2) вЭто.Поэтому, пожалуйста, обратите внимание на следующие моменты:
Выполнение останавливается, когда script1 выдал команды для запуска script1.1. Сэмпл sample_script (который печатает номер) работает нормально.
Обновление отладки: Я запустил следующий скрипт как sample_script и заметил следующие результаты:
set i = 450
while ($i > 1)
echo i is $i
set i = `expr "$i" - 1`
end
Запустив приведенный выше пример, я обнаружил, что вывод появляется только после завершения подпроцесса,Тем не менее, в моем случае, если я поставлю i = 550, терминал остается в состоянии ожидания и выход не появляется (даже через много минут).Отсюда и процесс застрял.Число i = 550 может быть выше или ниже для вас. Когда я бегу i = 550, используя операторы печати, я обнаружил, что выполнение sample_script останавливается при i = 98. Я не могу понять, почему !!
ПОЖАЛУЙСТА, подскажите мне, если вам нужна дополнительная информация.