如何主动更改TextEdit中的文本
How to change text in TextEdit actively
我在从 PyQt 主动更新我的 TextEdit 框时遇到问题。我想制作一个应用程序,它将分部分下载文件(每个部分的新线程,并行下载)并更新文本框中每个部分的当前状态,但我的应用程序 "freezes" 下载时间并在之后设置文本框下载完成,但如果我打印结果它看起来不错,控制台没有冻结。
我知道这段代码现在是 "a mess",但我改变了很多东西并尝试了不同的方法。
我标记了这个 "print"工作正常,下面是 setText,它会在下载时间内冻结我的应用程序。
如果 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")))
在循环中添加:QtCore.QCoreApplication.processEvents()
。这将在每次迭代时更新文本。
没有这个,PyQt 将在循环期间始终冻结。
更多信息:
< pyqt-gui-freezes-while-in-loop >
我在从 PyQt 主动更新我的 TextEdit 框时遇到问题。我想制作一个应用程序,它将分部分下载文件(每个部分的新线程,并行下载)并更新文本框中每个部分的当前状态,但我的应用程序 "freezes" 下载时间并在之后设置文本框下载完成,但如果我打印结果它看起来不错,控制台没有冻结。
我知道这段代码现在是 "a mess",但我改变了很多东西并尝试了不同的方法。
我标记了这个 "print"工作正常,下面是 setText,它会在下载时间内冻结我的应用程序。
如果 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")))
在循环中添加:QtCore.QCoreApplication.processEvents()
。这将在每次迭代时更新文本。
没有这个,PyQt 将在循环期间始终冻结。
更多信息: < pyqt-gui-freezes-while-in-loop >