首先先科普一下,tkinter是单线程的。也就是不推荐主线程跑GUI,再另外一个线程里面修改GUI里面的内容。(比如说用多线程爬虫然后在另外一个线程里面把爬取的内容放到GUI中,你当然可以这么做,只是不推荐)
由于requests不支持async编程,所以这里使用了aiohttp。
下面是爬取图片异步的方法以及代码,代码中有注释(欢迎python大佬指出错误):
import tkinter
from PIL import Image, ImageTk
from io import BytesIO
import aiohttp
import asyncio
class App:
def __init__(self):
self.app = tkinter.Tk()
self.image_url = ['https://s2.ax1x.com/2019/04/10/AT6bi6.jpg', 'https://s2.ax1x.com/2019/04/28/ElAgxJ.jpg']
tkinter.Button(self.app, command=lambda: asyncio.run(self.run_task())).pack()
self.image_list = []
self.app.mainloop()
async def run_task(self):
asyncio.create_task(self.keep_update()) # 异步更新GUI,避免卡死
async with aiohttp.ClientSession() as session:
for url in self.image_url:
async with session.get(url) as re