Как активно изменить текст в TextEdit


У меня возникли проблемы с активным обновлением поля TextEdit из PyQt. Я хочу создать приложение, которое будет загружать файлы по частям (новый поток для каждой части, загрузка параллельно) и обновлять текущий статус каждой части в текстовом поле, но мое приложение «зависает» на время загрузки и устанавливает текстовое поле после загрузки. завершено, хотя если я распечатаю результат, он выглядит нормально, в консоли нет зависаний.

Я знаю, что этот код сейчас "беспорядок", но я много чего менял и экспериментировал с разными подходами.

Я отметил эту "печать", которая работает нормально, и чуть ниже есть setText, который останавливает мое приложение на время загрузки.

Если это проблема с "TextEdit" из PyQt, пожалуйста, дайте мне знать, я поменяю, но пока такой информации не нашел.
Спасибо!

    def supervi(self):


    import os
    import urllib2
    N=2
    url = self.__url
    dir = self.path
    f_name = url.split("/")[len(url.split("/")) - 1]
    dir_tmp=dir + "\\TMP." + f_name
    if os.path.isdir(dir_tmp) == False:  
        os.mkdir(dir_tmp)
    for n in range(0,N):
        with open(dir_tmp+"\\file"+str(n), "w+b") as f:
            #f.write("")
            pass

    data = urllib2.urlopen(url)

    file_size = int(data.headers["Content-Length"].strip())

    import multiprocessing as mp
    data_block = file_size/N
    p=mp.Pool(N)
    for i in range(0, N):
        start = i * data_block
        stop = 0
        if not i == N - 1:
            stop = i * data_block + data_block - 1
        else:
            stop = file_size

        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:20.0) Gecko/20100101 Firefox/20.0",
            "Accept-Encoding": "gzip, deflate, sdch",
            "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
            "Accept-Language": "pl-PL,pl;q=0.8,en-US;q=0.6,en;q=0.4",
            "Connection": "keep-alive",
            "Range": "bytes=" + str(start) + "-" + str(stop)
        }

        req = urllib2.Request(url, headers=headers)
        from main import dziecko
        p.apply_async(dziecko,[i,req,dir_tmp])

    while True:
        sum=0
        for n in range(0,N):
            sum=sum+os.path.getsize(dir_tmp + "\\file" + str(n))

        if not sum < file_size:
            from main import del_and_combine
            del_and_combine(dir,dir_tmp,f_name,N)
            break
        for n in range(0,N):
            size=os.path.getsize(dir_tmp + "\\file" + str(n))
            print size           ##################THIS ONE
            self.url.setText(str(os.path.getsize(dir_tmp + "\\file0")))

person Pawel    schedule 27.06.2015    source источник


Ответы (1)


Добавьте : QtCore.QCoreApplication.processEvents() внутри вашего цикла. Это будет обновлять текст каждую итерацию. Без этого PyQt всегда будет зависать во время циклов.

Для получения дополнительной информации: ‹ pyqt-gui-freezes-while-in-loop >

person Olivier Giniaux    schedule 28.06.2015
comment
Хотя это может сработать, было бы гораздо лучше не блокировать цикл обработки событий Qt, используя QThread (см. второй ответ на вопрос, связанный с этим ответом) - person three_pineapples; 28.06.2015
comment
Спасибо, processEvents() работает нормально. Возможно, я попытаюсь использовать QThread позже, но сейчас он должен работать. - person Pawel; 28.06.2015