解决tkinter卡死问题

参考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

 

你可能感兴趣的:(python小项目,python爬图,百度图片爬取,tkinter界面)