鱼C论坛

 找回密码
 立即注册
查看: 3184|回复: 11

text组件显示延迟问题

[复制链接]
发表于 2016-7-20 09:32:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 python黑帽 于 2016-7-21 21:02 编辑

用tk做了个爬图片的爬虫,本来是下载一张就显示一张图片的链接,但是现在点击开始下载后程序就会无响应,然后等下载完了才把信息一下都显示出来
,进过debug发现是下载函数那里有问题,但是不知道是什么问题,反正没有那句的话显示其他信息就是同步的,贴上代码让各位大神看看
  1. import urllib.request
  2. import re
  3. import os
  4. import urllib.parse
  5. import requests
  6. from tkinter import *
  7. os.mkdir('E:/search_picture/')
  8. root=Tk()
  9. screen=Text(root,height=4,width=110)
  10. screen.pack()
  11. screen.insert(INSERT,"输入查找关键词:")
  12. screen2=Text(root,height=8,width=110)
  13. screen2.pack()

  14. def run():
  15.         count = 1
  16.         key=screen.get(1.0,END)
  17.         key=key.split(':')[1]

  18.         root_url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=0&gsm=500000064' % (
  19.         str(urllib.parse.quote(key)) + '%e5%a3%81%e7%ba%b8')

  20.         picture_url = []
  21.         html = requests.get(root_url).text
  22.         picture_url = re.findall('"objURL":"(.*?)",', html, re.S)

  23.         path = 'E:/search_picture/%d.jpg' % count
  24.         for url in picture_url:
  25.             try:
  26.                 #经过debug发现是下面这句代码的问题,但是不知道什么问题,反正没有下面这句显示其他东西就是正常的
  27.                 urllib.request.urlretrieve(url, path)
  28.                 screen2.insert(INSERT,'正在下载第%d张:%s\n' % (count, url))
  29.                 count = count + 1
  30.                 path = 'E:/search_picture/%d.jpg' % count
  31.             except:
  32.                 screen2.insert(INSERT,'当前图片链接不可用\n')
  33.         screen2.insert(INSERT,'下载完成,%d张图片保存在E盘search_picture文件夹\n'%count)

  34. bot=Button(root,text='开始下载',command=run)
  35. bot.pack()
  36. mainloop()

复制代码


感谢SixPy的帮助,问题已解决,贴上代码
  1. import urllib.request
  2. import re
  3. import os
  4. import urllib.parse
  5. import requests
  6. from tkinter import *
  7. import threading
  8. os.mkdir('E:/search_picture/')
  9. root=Tk()
  10. screen=Text(root,height=4,width=110)
  11. screen.pack()
  12. screen.insert(INSERT,"输入查找关键词:")
  13. screen2=Text(root,height=8,width=110)
  14. screen2.pack()
  15. def down(urls):
  16.     count = 1
  17.     for url in urls:
  18.         try:
  19.             path = 'E:/search_picture/%d.jpg' % count
  20.             urllib.request.urlretrieve(url,path)
  21.             screen2.insert(INSERT,"正在下载第%d张:%s\n"%(count,url))
  22.             count = count+1
  23.         except:
  24.             screen2.insert(INSERT,"当前图片链接不可用\n")
  25. def run():
  26.         count = 1
  27.         key=screen.get(1.0,END)
  28.         key=key.split(':')[1]

  29.         root_url = 'http://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=%s&pn=0&gsm=500000064' % (
  30.         str(urllib.parse.quote(key)) + '%e5%a3%81%e7%ba%b8')

  31.         picture_url = []
  32.         html = requests.get(root_url).text
  33.         picture_url = re.findall('"objURL":"(.*?)",', html, re.S)

  34.         p = threading.Thread(target=down,args=(picture_url,))
  35.         p.start()

  36. bot=Button(root,text='开始下载',command=run)
  37. bot.pack()
  38. mainloop()
复制代码

点击下载后

点击下载后

下载完才全部显示

下载完才全部显示
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-20 09:53:19 | 显示全部楼层
改为非阻塞的多线程下载

把下载功能用一个线程来完成
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-20 20:54:23 | 显示全部楼层
SixPy 发表于 2016-7-20 09:53
改为非阻塞的多线程下载

把下载功能用一个线程来完成

额。。不是很理解,不过先自己鼓捣一下
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-21 10:06:30 | 显示全部楼层
SixPy 发表于 2016-7-20 09:53
改为非阻塞的多线程下载

把下载功能用一个线程来完成

按照你的建议(其实不是很理解)改了一下代码变成这样,还是不行,你的做法具体应该怎么搞?可否详细说明?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-21 10:07:03 | 显示全部楼层
SixPy 发表于 2016-7-20 09:53
改为非阻塞的多线程下载

把下载功能用一个线程来完成

这是代码http://paste.ubuntu.com/20259243/
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-21 11:24:30 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-7-21 12:36:38 | 显示全部楼层
python黑帽 发表于 2016-7-21 10:07
这是代码http://paste.ubuntu.com/20259243/

把 down() 放到线程中执行,并插入文本到 text
注意用 lock
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-21 16:36:56 | 显示全部楼层
SixPy 发表于 2016-7-21 12:36
把 down() 放到线程中执行,并插入文本到 text
注意用 lock

感谢,问题已解决。只是仍然不明白为什么放在线程里面就可以解决延迟,不都是等图片下载完后才进行插入文本么,为什么会出现延迟现象呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-21 16:46:07 | 显示全部楼层
python黑帽 发表于 2016-7-21 16:36
感谢,问题已解决。只是仍然不明白为什么放在线程里面就可以解决延迟,不都是等图片下载完后才进行插入文 ...

解决了就把代码贴出来啊~

urllib 是阻塞式IO,当前 进程 会一直等它下载完成才恢复执行。所有你看到文本都是在完成后同时显示出来。
把每张图片用一个线程来下载,就不要等那么久了~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-7-21 21:03:03 | 显示全部楼层
SixPy 发表于 2016-7-21 16:46
解决了就把代码贴出来啊~

urllib 是阻塞式IO,当前 进程 会一直等它下载完成才恢复执行。所有你看到文 ...

代码已贴,感谢解答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-7-22 10:12:39 | 显示全部楼层
多线程下载图片,以及 界面互动~
http://bbs.fishc.com/thread-74052-1-1.html
(出处: 鱼C论坛)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-8-1 22:47:04 | 显示全部楼层
支持,不错的爬虫脚本,都可以使用,赞!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-8 23:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表