参考https://blog.csdn.net/qq_41204464/article/details/86707216
核心思路:
1.引入threading库
import threading
2.在界面回调函数里面添加装饰器
# 打包进线程(耗时的操作)
@staticmethod
def thread_it(func, *args):
t = threading.Thread(target=func, args=args)
t.setDaemon(True) # 守护--就算主界面关闭,线程也会留守后台运行(不对!)
t.start() # 启动
# t.join() # 阻塞--会卡死界面!
奉上本人写的基于tkinter做界面,然后百度关键字爬图程序。有日志调试,不卡死界面
#!/usr/bin/env python
#-*- coding:utf-8 -*-
import os, sys
import requests
import base64 #引入编码库
import threading #开线程
from time import sleep
if sys.version_info[0] == 2:
from Tkinter import *
from tkFont import Font
from ttk import *
#Usage:showinfo/warning/error,askquestion/okcancel/yesno/retrycancel
from tkMessageBox import *
#Usage:f=tkFileDialog.askopenfilename(initialdir='E:/Python')
#import tkFileDialog
#import tkSimpleDialog
else: #Python 3.x
from tkinter import *
from tkinter.font import Font
from tkinter.ttk import *
from tkinter.messagebox import *
#import tkinter.filedialog as tkFileDialog
#import tkinter.simpledialog as tkSimpleDialog #askstring()
class Application_ui(Frame):
#这个类仅实现界面生成功能,具体事件处理代码在子类Application中。
def __init__(self, master=None):
Frame.__init__(self, master)
self.master.title('百度关键字爬图 by达神 V1.0.3')
self.master.geometry('763x383')
self.createWidgets()
def createWidgets(self):
self.top = self.winfo_toplevel()
self.style = Style()
self.Command2Var = StringVar(value='清空日志')
self.style.configure('TCommand2.TButton', font=('宋体',9))
self.Command2 = Button(self.top, text='清空日志', textvariable=self.Command2Var, command=self.Command2_Cmd, style='TCommand2.TButton')
self.Command2.setText = lambda x: self.Command2Var.set(x)
self.Command2.text = lambda : self.Command2Var.get()
self.Command2.place(relx=0.356, rely=0.021, relwidth=0.096, relheight=0.065)
self.Text6Var = StringVar(value='8')
self.Text6 = Entry(self.top, textvariable=self.Text6Var, font=('宋体',9))
self.Text6.setText = lambda x: self.Text6Var.set(x)
self.Text6.text = lambda : self.Text6Var.get()
self.Text6.place(relx=0.157, rely=0.439, relwidth=0.075, relheight=0.065)
self.Text5Font = Font(font=('宋体',9))
self.Text5 = Text(self.top, fg='#FFFFFF', bg='#000000', font=self.Text5Font)
self.Text5.place(relx=0.042, rely=0.606, relwidth=0.295, relheight=0.316)
self.Text5.insert('1.0','说明:\n将图片关键字和爬取页数信息设置好后开\n始爬图。理论值一页30张图片,图片保存\n路径为同录下的该文件夹\n爬取页数最大30推荐设置10\n')
self.Text4Font = Font(font=('黑体',9))
self.Text4 = Text(self.top, fg='#00FF00', bg='#000000', font=self.Text4Font)
self.Text4.place(relx=0.356, rely=0.104, relwidth=0.63, relheight=0.859)
self.Text4.insert('1.0','爬图日志by达神\n')
self.Command1Var = StringVar(value='开始爬图')
self.style.configure('TCommand1.TButton', font=('宋体',9))
self.Command1 = Button(self.top, text='开始爬图', textvariable=self.Command1Var, command=self.Command1_Cmd, style='TCommand1.TButton')
self.Command1.setText = lambda x: self.Command1Var.set(x)
self.Command1.text = lambda : self.Command1Var.get()
self.Command1.place(relx=0.241, rely=0.439, relwidth=0.096, relheight=0.086)
self.Text3Var = StringVar(value='1')
self.Text3 = Entry(self.top, textvariable=self.Text3Var, font=('宋体',9))
self.Text3.setText = lambda x: self.Text3Var.set(x)
self.Text3.text = lambda : self.Text3Var.get()
self.Text3.place(relx=0.052, rely=0.439, relwidth=0.085, relheight=0.065)
self.Text2Var = StringVar(value='10')
self.Text2 = Entry(self.top, textvariable=self.Text2Var, font=('宋体',9))
self.Text2.setText = lambda x: self.Text2Var.set(x)
self.Text2.text = lambda : self.Text2Var.get()
self.Text2.place(relx=0.241, rely=0.23, relwidth=0.085, relheight=0.065)
self.Text1Var = StringVar(value='口罩女')
self.Text1 = Entry(self.top, textvariable=self.Text1Var, font=('宋体',9))
self.Text1.setText = lambda x: self.Text1Var.set(x)
self.Text1.text = lambda : self.Text1Var.get()
self.Text1.place(relx=0.052, rely=0.23, relwidth=0.159, relheight=0.065)
self.Label4Var = StringVar(value='总轮数')
self.style.configure('TLabel4.TLabel', anchor='w', foreground='#FF0000', font=('宋体',9))
self.Label4 = Label(self.top, text='总轮数', textvariable=self.Label4Var, style='TLabel4.TLabel')
self.Label4.setText = lambda x: self.Label4Var.set(x)
self.Label4.text = lambda : self.Label4Var.get()
self.Label4.place(relx=0.168, rely=0.334, relwidth=0.064, relheight=0.065)
self.Label3Var = StringVar(value='图片保存路径')
self.style.configure('TLabel3.TLabel', anchor='w', foreground='#FF0000', font=('宋体',9))
self.Label3 = Label(self.top, text='图片保存路径', textvariable=self.Label3Var, style='TLabel3.TLabel')
self.Label3.setText = lambda x: self.Label3Var.set(x)
self.Label3.text = lambda : self.Label3Var.get()
self.Label3.place(relx=0.052, rely=0.334, relwidth=0.096, relheight=0.065)
self.Label2Var = StringVar(value='爬取页数')
self.style.configure('TLabel2.TLabel', anchor='w', foreground='#FF8000', font=('宋体',9))
self.Label2 = Label(self.top, text='爬取页数', textvariable=self.Label2Var, style='TLabel2.TLabel')
self.Label2.setText = lambda x: self.Label2Var.set(x)
self.Label2.text = lambda : self.Label2Var.get()
self.Label2.place(relx=0.241, rely=0.125, relwidth=0.106, relheight=0.065)
self.Label1Var = StringVar(value='关键字')
self.style.configure('TLabel1.TLabel', anchor='w', foreground='#0000FF', font=('宋体',9))
self.Label1 = Label(self.top, text='关键字', textvariable=self.Label1Var, style='TLabel1.TLabel')
self.Label1.setText = lambda x: self.Label1Var.set(x)
self.Label1.text = lambda : self.Label1Var.get()
self.Label1.place(relx=0.073, rely=0.125, relwidth=0.085, relheight=0.065)
class Application(Application_ui):
#这个类实现具体的事件处理回调函数。界面生成代码在Application_ui中。
def __init__(self, master=None):
Application_ui.__init__(self, master)
def getManyPages(self,keyword, pages,now=0):
params = []
for i in range(30+30*pages*now, 30 * pages*(now+1) + 30, 30):
params.append({
'tn': 'resultjson_com',
'ipn': 'rj',
'ct': 201326592,
'is': '',
'fp': 'result',
'queryWord': keyword,
'cl': 2,
'lm': -1,
'ie': 'utf-8',
'oe': 'utf-8',
'adpicid': '',
'st': -1,
'z': '',
'ic': 0,
'word': keyword,
's': '',
'se': '',
'tab': '',
'width': '',
'height': '',
'face': 0,
'istype': 2,
'qc': '',
'nc': 1,
'fr': '',
'pn': i,
'rn': 30,
'gsm': '1e',
'1488942260214': ''
})
url = 'https://image.baidu.com/search/acjson'
urls = []
for i in params:
urls.append(requests.get(url, params=i,timeout=600000).json().get('data'))
return urls
def getImg(self,dataList, localPath):
if not os.path.exists(localPath): # 新建文件夹
os.mkdir(localPath)
x = 0
for list in dataList:
for i in list:
if list==dataList[-1] and i==list[-1]:
print("本轮下载完毕,5秒后检索下一轮")
self.Text4.insert(END, '本轮下载完毕,5秒后检索下一轮\n')
global now
print("当前已经进行完了第:%s轮" % (now + 1))
self.Text4.insert(END,"当前已经进行完了第:%s轮\n" % (now + 1))
sleep(5)
if now