锐单电子商城 , 一站式电子元器件采购平台!
  • 电话:400-990-0325

解决tkinter卡死问题

时间:2023-01-27 02:30:00 p784xlf连接器d2圆形连接器p20k2hgp20j9qj圆形电连接器

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

 

锐单商城拥有海量元器件数据手册IC替代型号,打造电子元器件IC百科大全!

相关文章