wxPython - захватывать вывод оболочки в виджет textctrl? - PullRequest
1 голос
/ 10 июля 2011

Я изучаю Python и wxPython одновременно ... :) Итак, у меня есть набор файлов Python, которые отлично работают из командной строки: ./scan -d test ~/Pictures - например, создаст базу данных моих изображенийпод названием «test».

Я усердно работал над этим (я не писал исходные файлы Python для командной строки), и я могу заставить его работать, используя:

def bt_ScanUpdateClick(self, event):
    self.SetSizeWH(450,360)

    ## DEBUG
    self.tc_MainDatabase.Value = "test.db"


    if self.tc_MainDatabase.Value == "":
        self.LogWindow.Value += "ERROR:\tNo database name selected!\n"
    else:
        scanCMD = "./scan -d " + self.tc_MainDatabase.Value + " "

        numLines=0
        maxLines=(int(self.multiText.GetNumberOfLines()))

        if self.multiText.GetLineText(numLines) == "":
            self.LogWindow.Value += "ERROR\tNo folder selected to scan!\n"
        else:
            self.LogWindow.Value += "Running Scan...\n\n"
            while (numLines < maxLines):
                scanCMD += str(self.multiText.GetLineText(numLines)) + " "
                numLines += 1

            self.LogWindow.Value += scanCMD

            p = subprocess.Popen([scanCMD],shell=True,stdout=subprocess.PIPE,stdin=subprocess.PIPE)
            self.LogWindow.Value += p.communicate()[0]

Это создает для меня проблему:

  1. Как только я нажимаю кнопку, чтобы активировать ее, она даже не достигает части self.SetSizeWH (450,360) функции.Он просто остается в «выключенном» состоянии.Когда команда выполнена, приложение возвращается к жизни со всем в окне вывода (self.LogView) уже ... Я хотел бы получить вывод в режиме "реального времени" ... возможно?

Есть мысли?

1 Ответ

1 голос
/ 10 июля 2011

Грубо говоря, обновления экрана происходят во время каждой итерации цикла событий.Пока ваш код работает, цикл обработки событий застревает в одной и той же итерации, поэтому обновления экрана не могут происходить.

Чтобы обойти это, вам нужно запустить долгосрочное задание в отдельном потоке или процессе.Поскольку wxPython является однопоточным, любые обновления GUI (например, запись строк вывода) должны выполняться в основном потоке.Для этого ваш рабочий поток может использовать wx.CallAfter, который при ближайшем удобстве запланирует запуск команды в потоке графического интерфейса.

Для получения дополнительной информации см. Страницу Долгосрочные задачи на wxPython wiki и посмотрите этот ответ на вопрос wxPython: Проблемы с темой. на этом сайте.

...