2015-06-27 2 views
0


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

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

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

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

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"))) 

ответ

1

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

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

+0

Хотя это может работать, было бы гораздо лучше, чтобы не блокировать цикл обработки событий Qt в первую очередь, с помощью 'QThread' (см второго ответа на вопрос, связанный с в этом ответе) –

+0

Спасибо, processEvents() работает отлично. Возможно, я попытаюсь использовать QThread позже, но теперь он должен делать работу – Pawel

Смежные вопросы