Вы сталкивались с тем, что текстовое поле не отвечает? - PullRequest
0 голосов
/ 24 ноября 2011

Мне нужно знать, сталкивались ли вы когда-либо с замедлением или даже зависали при использовании текстового поля для отображения большого количества данных.

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

Я попробовал две реализации:

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. Я не могу понять, почему !!

ПОЖАЛУЙСТА, подскажите мне, если вам нужна дополнительная информация.

Ответы [ 2 ]

2 голосов
/ 24 ноября 2011

Я использовал tk почти 20 лет и не заметил никаких проблем с большими объемами текста, хотя я не думаю, что когда-либо пытался загрузить более нескольких десятков тысяч строк.Сколько данных вы пытаетесь показать?Используете ли вы большое количество тегов и разных шрифтов, или это просто текст?

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

Полагаю, это не ограничение текстового виджета, и переключение на холст не поможет.Возможно, проблема в вашем коде, но, не увидев ваш код, невозможно найти решение.

0 голосов
/ 24 ноября 2011

В качестве обходного пути, возможно, вместо того, чтобы показывать весь вывод в реальном времени, показывать последние 100 строк в реальном времени?Полный вывод все еще может быть помещен в файл журнала для последующей загрузки при необходимости.

...