鱼C论坛

 找回密码
 立即注册
查看: 2623|回复: 1

[已解决]tkinter插入图片的玄学问题....

[复制链接]
发表于 2017-8-5 23:58:17 | 显示全部楼层 |阅读模式
0鱼币
本帖最后由 什么鬼… 于 2017-8-5 23:59 编辑

最近看了鱼哥的tkinter视频,然后心血来潮想练练手,于是准备写一个有GUI的b站的爬虫,但是今天碰到个玄学问题....
首先:遇到问题的地方
1.png
这里我的get_video函数是一个二级按钮的回调函数.
我的不完整的GUI是这样的
2.png
程序目标:通过用户选板块,然后获取分区,选择分区之后,取分区里面的视频的封面和标题,放在预览区供选择
然后通过checkbutton获取所需要的视频,最后再下载
中间遇到过一些问题,比如什么PhotoImage必须是gif不能jpg啊
还有图片是不是要本地先下载啊
但是楼主google了一波发现有直接通过url搞出图片的方法
然而
获取到了图片之后在video区域并不显示. 就像下图
3.png
我在前面加了一个print(pic_url)查看图片发现没有问题.(print的结果如图1)


后来我又把代码写到另外一个文件里面,发现图片又可以显示,如图
4.png

这就很迷了...楼主表示找不到原因,目前已经弃疗,希望大佬们帮忙看看分析一下....

代码贴在下面咯(不要吐槽代码风格....)问题在图1里面有,代码里面用*分割开了
  1. from tkinter import *
  2. from PIL import Image,ImageTk
  3. import io
  4. import urllib.request
  5. import json
  6. import requests
  7. import re

  8. class Main_Plat:
  9.     def __init__(self):
  10.         self.bilibili=B_Station()      # 获取b站资源
  11.         self.root=Tk()
  12.         self.root.geometry("1000x480+200+20")
  13.         self.root.resizable(width=True,height=False)
  14.         self.root.title("bilibili小爬虫!")

  15.         self.bankuaivar=StringVar()
  16.         self.smallbankuaivar = StringVar()
  17.         self.videovar = StringVar()

  18.         self.bankuai=Frame(master=self.root)
  19.         self.smallbankuai = Frame(master=self.root)
  20.         self.videobankuai=Frame(master=self.root)
  21.         #self.scrolledtext=ScrolledText(self.videobankuai)
  22.         #self.scrolledtext.grid()
  23.         self.small_bankuai_list=[]
  24.         self.video_list=[]          # 装需要下载的视频
  25.         self.check_var_list=[]
  26.         part_list = ["动画",
  27.                     "番剧",
  28.                     "国创",
  29.                     "音乐",
  30.                     "舞蹈",
  31.                     "游戏",
  32.                     "科技",
  33.                     "生活",
  34.                     "鬼畜",
  35.                     "时尚",
  36.                     "广告",
  37.                     "娱乐",
  38.                     "电影",
  39.                     "电视剧"
  40.                    ]

  41.         label = Label(self.smallbankuai, text='分区', fg="red", font=("微软雅黑", 12), width=16)
  42.         label.pack(fill=X)

  43.         label=Label(self.bankuai,text='板块',fg="red",font=("微软雅黑",12),width=8)
  44.         label.pack(fill=X)

  45.         label=Label(self.videobankuai,text="video预览区",fg="red",font=('微软雅黑',12))
  46.         label.pack()
  47.         for part in part_list:
  48.             btn=Radiobutton(self.bankuai,text=part,variable=self.bankuaivar,value=part,
  49.                             indicatoron=False,command=self.get_next,font=("微软雅黑",12),width=8)
  50.             btn.pack(fill=X)

  51.         self.bankuai.pack(side=LEFT,anchor=NW)
  52.         self.smallbankuai.pack(side=LEFT,anchor=N)
  53.         self.videobankuai.pack(anchor=N)

  54.         self.root.mainloop()

  55.     def get_next(self):
  56.         if self.small_bankuai_list:
  57.             for btn in self.small_bankuai_list:
  58.                 btn.destroy()
  59.         self.small_bankuai_list=[]
  60.         temp = self.bilibili.get_small_part(self.bankuaivar.get())   # 得到一个元组构成的列表(tid,link,name)
  61.         for each in temp:
  62.             btn=Radiobutton(self.smallbankuai,text=each[2],variable=self.smallbankuaivar,
  63.                             value=each[2],indicatoron=False,width=16,font=("微软雅黑",12),command=self.get_video)
  64.             btn.pack(fill=X)
  65.             self.small_bankuai_list.append(btn)

  66.     def get_video(self):
  67.         smallbankuai = self.bilibili.get_small_part(self.bankuaivar.get())
  68.         video_list = self.bilibili.get_one(smallbankuai,1)          # 获取视频资料的json,后续对页码进行修改--通过变量获取
  69.         item=video_list[0]          #这里本来是一个for循环,这里为了测试把for item in  video_list:改成item=video_list[0]
  70.         var = StringVar()
  71. #***********************************************************************************************************************************
  72.         pic_url = item['pic']
  73.         print(pic_url)
  74.         image_bytes = urllib.request.urlopen(pic_url).read()
  75.         data_stream = io.BytesIO(image_bytes)
  76.         pil_image = Image.open(data_stream).resize((150,150),Image.ANTIALIAS)
  77.         tk_image = ImageTk.PhotoImage(pil_image)

  78.         label=Label(self.videobankuai,image=tk_image)           #测试使用Label
  79.         label.pack()
  80. #************************************************************************************************************************************

  81.         choice = Checkbutton(self.videobankuai,text=item['title'],image=tk_image,variable=var,
  82.                             onvalue=item["aid"],offvalue='0',command=self.callback)
  83.         choice.pack()                                           #实际使用的choice

  84.     def  callback1(self):
  85.         for each in self.check_var_list:
  86.             temp = each.get()
  87.             if temp =='0':
  88.                 self.video_list.remove(temp)
  89.             if temp !='0':
  90.                 self.video_list.append(temp)





  91. class B_Station:
  92.     def __init__(self):
  93.         self.u = requests.session()
  94.         self.headers = {"User-Agent": "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;"}
  95.         r = self.u.get("https://www.bilibili.com/", headers=self.headers)
  96.         r.encoding = r.apparent_encoding
  97.         self.part2link={}
  98.         self.link2part={}
  99.         while '<div id="home-app"></div>' not in r.text:
  100.             r = self.u.get("https://www.bilibili.com/", headers=self.headers)
  101.             r.encoding = r.apparent_encoding
  102.         main_page = r.text
  103.         part_list = re.findall(r'<a href="//([^"]+)" class="nav-link"><div class="num-wrap"><span class="num">--</span></div><div class="nav-name">([^<]+)</div></a>',main_page)
  104.         for l, p in part_list:
  105.             if p!="影视":
  106.                 l = 'https://'+l
  107.                 self.part2link.setdefault(p,l)
  108.                 self.link2part.setdefault(l,p)

  109.         self.part2link.setdefault("电影",'https://bangumi.bilibili.com/movie/')
  110.         self.part2link.setdefault('电视剧','https://bangumi.bilibili.com/tv/')     # 电影区格式不同啊!!
  111.         self.link2part.setdefault('https://bangumi.bilibili.com/movie/','电影')
  112.         self.link2part.setdefault('https://bangumi.bilibili.com/tv/','电视剧')


  113.     def get_small_part(self,part):   # 返回一个元组构成的列表(tid,link,name)
  114.         part_link = self.part2link[part]
  115.         r = self.u.get(part_link,headers=self.headers)
  116.         r.encoding = r.apparent_encoding
  117.         small_part_list = re.findall(r'<li desc="" tid=(\d*) ><a href="([^"]+)">([^<]+)</a></li>',r.text)
  118.         if not small_part_list:
  119.             small_part_list = re.findall(r'<li desc="" tid="(\d*)" ?><a href="([^"]+)">([^<]+)</a>', r.text)
  120.         if part == "广告":
  121.             small_part_list = [('166','/video/ad-ad-1.html','全部')]      # 对广告区的空分区的处理
  122.         return small_part_list

  123.     def get_one(self,small_part_list,page):   # 传入上面的列表和页数,返回多个字典
  124.         url = "https://api.bilibili.com/archive_rank/getarchiverankbypartion?callback=type=jsonp&tid={tid}&pn={page}".format(tid=str(small_part_list[0][0]),page=str(page))
  125.         r = self.u.get(url,headers=self.headers)
  126.         r.encoding=r.apparent_encoding
  127.         temp = json.loads(r.text)
  128.         temp = temp["data"]['archives']
  129.         return temp


  130. if __name__ == "__main__":
  131.     plat=Main_Plat()
复制代码
最佳答案
2017-8-5 23:58:18
tk_image 不能是 临时变量,否则会被当作垃圾回收,图片就不显示了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-8-5 23:58:18 | 显示全部楼层    本楼为最佳答案   
tk_image 不能是 临时变量,否则会被当作垃圾回收,图片就不显示了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-18 10:59

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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