【tkinter】模板 + 如何制作一个百度爬虫软件?

1、多级窗口的显示以及我的模板

import os.path
import tkinter as tk
from PIL import Image, ImageTk
from pandas import read_excel, DataFrame
from tkinter.scrolledtext import ScrolledText
from tkinter import filedialog as fd
import tkinter.messagebox


# 打开指定图片,缩放至自定尺寸
def get_image(filename, width, height):
    im = Image.open(filename).resize((width, height))
    return ImageTk.PhotoImage(im)


class RootWindow:
    def __init__(self, master):
        self.master = master

        for i in range(num_win):
            self.new_button(title1, f'{i}', win_list[i], int((bg_width - bt_width) / 2),
                            int(bg_height * (0.9 / num_win * i + 0.1)),
                            bt_width, bt_height)

    # x, y, width, height 分别代表button的左上角放置位置xy和按钮的长宽
    def new_button(self, text, number, _class, x, y, width, height):
        btnNew = tk.Button(self.master, text=text, font=('Arial', 14), bg='#84bf96', compound=tk.CENTER,
                           command=lambda: self.new_window(number, _class))
        btnNew.place(x=x, y=y, width=width, height=height)

    def new_window(self, number, class_):
        # Toplevel(顶级窗口)组件类似于 Frame 组件,但 Toplevel 组件是一个独立的顶级窗口,
        # 这种窗口通常拥有标题栏、边框等部件,和 Tk() 创建出来的根窗口是一样的,共享着一样的方法。
        self.new = tk.Toplevel(self.master)
        class_(self.new, number)


# 小窗口的父类
class Win:
    def __init__(self, master, number):
        self.sub_bg_width = 900
        self.sub_bg_height = 600
        self.master = master
        self.master.geometry(f"{self.sub_bg_width}x{self.sub_bg_height}+800+100")
        self.master.resizable(False, False)
        self.master.iconbitmap("./8字标.ico")

        # 这里是程序的输出窗口
        self.t = ScrolledText(self.master, height=34, width=83)
        # text最后pack
        self.t.place(x=297, y=130)
        # 输出结果对比表
        self.file_compare = DataFrame(columns=list(range(1, 23)), index=list(range(1, 23)))

        # self.master.resizable(False, False)

        # self.frame = tk.Frame(self.master)
        # self.frame.pack()

    #     self.quit = tk.Button(self.master, text=f"退出窗口{number}", font=('Arial', 14), bg='#84bf96', compound=tk.CENTER,
    #                           command=self.close_window)
    #     self.quit.pack()
    #
    # def close_window(self):
    #     self.master.destroy()
    # 获取文件夹地址
    def dir_path_get(self, _var_change):
        dir_in_path = fd.askdirectory()
        _var_change.set(dir_in_path)

    def file_path_get(self, _var_change):
        file_in_path = fd.askopenfilename()
        _var_change.set(file_in_path)

    def judge_input(self, _input, input_type, _default='./'):
        '''
        判断输入是否合法
        :param self:
        :param _input: 输入
        :param input_type: 输入类型
        :param _default: 默认输入
        :return:
        '''
        if input_type == 'file':
            result = os.path.isfile(_input)
            if not result:
                self.t.insert(tk.END, "错误:请输入正确的文件路径!\n\n")
                self.t.update()
                tk.messagebox.showerror('错误', '请输入正确的文件路径!')

            else:
                return _input
        else:
            result = os.path.isdir(_input)
            if not result:
                self.t.insert(tk.END, "将使用默认文件夹路径\n\n")
                self.t.update()
                return _default
            else:
                return _input


# 小窗口1
# 对比两个研究方向相同的论文的个数
class Win1(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        # self.master.geometry("900x600+200+200")
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n    1、该程序的作用是对比两个研究方向相同的论文的个数,输出分别为same.xls(相同文献表)"
                                   "、different1.xls(文件1的不同文献表)、different2.xls(文件2的不同文献表)\n\n"
                                   "    2、请输入将要对比的两个文件。默认输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会在右边窗口显示程序运行状态\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框1
        self.var_in1 = tk.StringVar()
        self.var_in1.set('请在此处输入文件1的地址')
        self.entry_in1 = tk.Entry(self.master, textvariable=self.var_in1, font=('Arial', 14), width=42)
        self.entry_in1.place(x=20, y=10)

        # 地址输入按钮1
        self.but_in1 = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in1))
        self.but_in1.place(x=540, y=10)

        # 输入框2
        self.var_in2 = tk.StringVar()
        self.var_in2.set('请在此处输入文件2的地址')
        self.entry_in2 = tk.Entry(self.master, textvariable=self.var_in2, font=('Arial', 14), width=42)
        self.entry_in2.place(x=20, y=50)

        # 地址输入按钮2
        self.but_in2 = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in2))
        self.but_in2.place(x=540, y=50)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=90)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=90)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.excel_deal)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 1对比两个研究方向相似的文件个数
    def excel_deal(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')

            input_1 = self.judge_input(self.var_in1.get(), 'file')

            input_2 = self.judge_input(self.var_in2.get(), 'file')

            store_path = self.judge_input(self.var_out.get(), 'dir')

            file_1 = read_excel(input_1)
            file_2 = read_excel(input_2)
            dataframe_1 = DataFrame(file_1)
            dataframe_2 = DataFrame(file_2)

            title_1 = list(dict.values(dataframe_1.to_dict()["Article Title"]))
            title_2 = list(dict.values(dataframe_2.to_dict()["Article Title"]))

            same = []
            different_1 = list(range(len(title_1)))
            different_2 = list(range(len(title_2)))
            for i in range(len(title_1)):
                for j in range(len(title_2)):
                    if title_1[i] == title_2[j]:
                        same.append(i)
                        different_1.remove(i)
                        different_2.remove(j)

            file_column1 = [x for x in dataframe_1]
            file_column2 = [x for x in dataframe_2]

            file_same = DataFrame(columns=file_column1)
            file_different_1 = DataFrame(columns=file_column1)
            file_different_2 = DataFrame(columns=file_column2)

            for i in range(len(same)):
                file_same.loc[i] = dataframe_1.loc[same[i]].tolist()

            for i in range(len(different_1)):
                file_different_1.loc[i] = dataframe_1.loc[different_1[i]].tolist()

            for i in range(len(different_2)):
                file_different_2.loc[i] = dataframe_2.loc[different_2[i]].tolist()

            file_same.to_excel(os.path.join(store_path, 'same.xls'), index=False)
            file_different_1.to_excel(os.path.join(store_path, 'different_1.xls'), index=False)
            file_different_2.to_excel(os.path.join(store_path, 'different_2.xls'), index=False)

            self.t.insert(tk.END, f'相同文献的个数为:{len(same)}\n\n')
            self.t.insert(tk.END,
                          f'文件1和文件2相同部分保存为了same.xls,不同部分,属于文件1的保存为了different1.xls。不同部分,属于文件2的保存为了different2.xls\n\n')
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()
        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')


# 小窗口2
# 对比同一文件夹下所有学科之间的交叉数 excel_compare
class Win2(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        # self.master.geometry("900x600+200+200")
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n    1、该程序对比了同一文件夹下所有学科之间的交叉数,输出为一"
                                   "个关于各个学科交叉数目的表格 file_compare.xls\n\n"
                                   "    2、默认的输入路径为程序所在目录文件夹下的data文件夹,默认输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会依次将不为零的结果显示在右边窗口。\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框
        self.var_in = tk.StringVar()
        self.var_in.set('请在此处输入输入文件夹的地址')
        self.entry_in = tk.Entry(self.master, textvariable=self.var_in, font=('Arial', 14), width=42)
        self.entry_in.place(x=20, y=30)

        # 地址输入按钮
        self.but_in = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_in))
        self.but_in.place(x=540, y=30)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=80)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=80)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.excel_compare)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 2对比同一文件夹下所有学科之间的交叉数
    def excel_compare(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')

            root = self.judge_input(self.var_in.get(), 'dir', './data')

            store_path = self.judge_input(self.var_out.get(), 'dir', './')

            for i in os.listdir(root):
                for j in os.listdir(root):
                    self.deal_excel(i, j, root)
            self.file_compare.to_excel(os.path.join(store_path, "./file_compare.xls"))
            self.t.insert(tk.END, '程序运行结束!')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')

    def deal_excel(self, file1, file2, root):
        file_1 = read_excel(os.path.join(root, file1))
        file_2 = read_excel(os.path.join(root, file2))

        dataframe_1 = DataFrame(file_1)
        dataframe_2 = DataFrame(file_2)

        title_1 = list(dict.values(dataframe_1.to_dict()["Article Title"]))
        title_2 = list(dict.values(dataframe_2.to_dict()["Article Title"]))

        same = []
        different_1 = list(range(len(title_1)))
        different_2 = list(range(len(title_2)))
        for i in range(len(title_1)):
            for j in range(len(title_2)):
                if title_1[i] == title_2[j]:
                    same.append(i)
                    different_1.remove(i)
                    different_2.remove(j)

        file_column1 = [x for x in dataframe_1]
        file_column2 = [x for x in dataframe_2]

        file_same = DataFrame(columns=file_column1)
        file_different_1 = DataFrame(columns=file_column1)
        file_different_2 = DataFrame(columns=file_column2)

        for i in range(len(same)):
            file_same.loc[i] = dataframe_1.loc[same[i]].tolist()

        for i in range(len(different_1)):
            file_different_1.loc[i] = dataframe_1.loc[different_1[i]].tolist()

        for i in range(len(different_2)):
            file_different_2.loc[i] = dataframe_2.loc[different_2[i]].tolist()

        file_same.to_excel('same.xls', index=False)
        file_different_1.to_excel('different_1.xls', index=False)
        file_different_2.to_excel('different_2.xls', index=False)

        if len(same) != 0:
            self.t.insert(tk.END, "-" * 20)
            self.t.insert(tk.END, '\n')
            self.t.insert(tk.END, "文件1:{} , 文件2:{}".format(file1, file2))
            self.t.insert(tk.END, '\n')
            self.t.insert(tk.END, "相同的数目为:{}".format(len(same)))
            self.t.insert(tk.END, '\n')
            self.t.see(tk.END)
            self.t.update()

        file1_num = int(file1[0:2])
        file2_num = int(file2[0:2])
        self.file_compare.loc[file1_num][file2_num] = len(same)


# 小窗口3
# 计算出研究方向编号1和研究方向编号2两列中各个不同学科的数目 def excel_cal_elem
class Win3(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n"
                                   "    1、该程序计算了研究方向编号1和研究方向编号2两列中各个不同学科的数目 并将结果制表,存为count.xls\n\n"
                                   "    2、请输入文件路径。默认的输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会依次将预览表格输出在右边窗口。\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框
        self.var_in = tk.StringVar()
        self.var_in.set('请在此处输入文件的地址')
        self.entry_in = tk.Entry(self.master, textvariable=self.var_in, font=('Arial', 14), width=42)
        self.entry_in.place(x=20, y=30)

        # 地址输入按钮
        self.but_in = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in))
        self.but_in.place(x=540, y=30)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=80)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=80)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.excel_cal_elem)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 3计算出研究方向编号1和研究方向编号2两列中各个不同学科的数目
    def excel_cal_elem(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')

            file_path = self.judge_input(self.var_in.get(), 'file')
            store_path = self.judge_input(self.var_out.get(), 'dir')

            file = read_excel(file_path)
            dataframe = DataFrame(file)
            dataframe = dataframe.fillna(int(0))

            title1 = list(dict.values(dataframe.to_dict()["研究方向编号1"]))
            title2 = list(dict.values(dataframe.to_dict()["研究方向编号2"]))

            count = DataFrame(columns=["研究方向编号1", "研究方向编号2"], index=[range(1, 23)])

            for i in range(1, 23):
                count.loc[i] = [0, 0]

            for j in [0, 1]:
                if j == 0:
                    for i in title1:
                        count.iloc[int(i), j] += 1
                else:
                    for i in title2:
                        count.iloc[int(i), j] += 1

            count.to_excel(os.path.join(store_path, "count.xls"))
            self.t.insert(tk.END, "列的元素个数表:\n")
            self.t.insert(tk.END, count)
            self.t.insert(tk.END, '\n\n')
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')


if __name__ == '__main__':
    # 子窗口数
    num_win = 3
    # 子窗口列表
    win_list = [Win1, Win2, Win3]

    bg_width = 640
    bg_height = 360
    bt_width = 400
    bt_height = 50

    # 窗体一的名字
    title1 = "对比两个excel中的相同论文数并输出"
    # 窗体二的名字
    title2 = "多个excel相同论文数横向对比,并画表"
    # 窗体三的名字
    title3 = "excel列的元素个数计算"
    window = tk.Tk()
    window.title("文献对比处理软件 作者:xxx")
    window.geometry(f"{bg_width}x{bg_height}+100+100")
    # 不能被调整大小
    window.resizable(False, False)
    # 设置窗口图标
    window.iconbitmap("./8字标.ico")

    canvas = tk.Canvas(window, width=bg_width, height=bg_height)
    # image_file = tk.PhotoImage(file='new.gif')
    im_window = get_image('1.jpg', bg_width, bg_height)
    canvas.create_image(bg_width / 2, bg_height / 2, image=im_window)
    canvas.pack()

    self = RootWindow(window)
    window.mainloop()

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

2、单个窗口模板

import os.path
import tkinter as tk
from PIL import Image, ImageTk
from pandas import read_excel, DataFrame
from tkinter.scrolledtext import ScrolledText
from tkinter import filedialog as fd
import tkinter.messagebox


# 打开指定图片,缩放至自定尺寸
def get_image(filename, width, height):
    im = Image.open(filename).resize((width, height))
    return ImageTk.PhotoImage(im)


# 小窗口的父类
class Win:
    def __init__(self, master, number):
        self.sub_bg_width = 900
        self.sub_bg_height = 600
        self.master = master
        self.master.geometry(f"{self.sub_bg_width}x{self.sub_bg_height}+800+100")
        self.master.resizable(False, False)
        self.master.iconbitmap("./8.ico")

        # 这里是程序的输出窗口
        self.t = ScrolledText(self.master, height=34, width=83)
        # text最后pack
        self.t.place(x=297, y=130)
        # 输出结果对比表
        self.file_compare = DataFrame(columns=list(range(1, 23)), index=list(range(1, 23)))

        # self.master.resizable(False, False)

        # self.frame = tk.Frame(self.master)
        # self.frame.pack()

    #     self.quit = tk.Button(self.master, text=f"退出窗口{number}", font=('Arial', 14), bg='#84bf96', compound=tk.CENTER,
    #                           command=self.close_window)
    #     self.quit.pack()
    #
    # def close_window(self):
    #     self.master.destroy()
    # 获取文件夹地址
    def dir_path_get(self, _var_change):
        dir_in_path = fd.askdirectory()
        _var_change.set(dir_in_path)

    def file_path_get(self, _var_change):
        file_in_path = fd.askopenfilename()
        _var_change.set(file_in_path)

    def judge_input(self, _input, input_type, _default='./'):
        '''
        判断输入是否合法
        :param self:
        :param _input: 输入
        :param input_type: 输入类型
        :param _default: 默认输入
        :return:
        '''
        if input_type == 'file':
            result = os.path.isfile(_input)
            if not result:
                self.t.insert(tk.END, "错误:请输入正确的文件路径!\n\n")
                self.t.update()
                tk.messagebox.showerror('错误', '请输入正确的文件路径!')

            else:
                return _input
        else:
            result = os.path.isdir(_input)
            if not result:
                self.t.insert(tk.END, "将使用默认文件夹路径\n\n")
                self.t.update()
                return _default
            else:
                return _input


# 小窗口1
# 对比两个研究方向相同的论文的个数
class Win1(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        # self.master.geometry("900x600+200+200")
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n    1、该程序的作用是对比两个研究方向相同的论文的个数,输出分别为same.xls(相同文献表)"
                                   "、different1.xls(文件1的不同文献表)、different2.xls(文件2的不同文献表)\n\n"
                                   "    2、请输入将要对比的两个文件。默认输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会在右边窗口显示程序运行状态\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框1
        self.var_in1 = tk.StringVar()
        self.var_in1.set('请在此处输入文件1的地址')
        self.entry_in1 = tk.Entry(self.master, textvariable=self.var_in1, font=('Arial', 14), width=42)
        self.entry_in1.place(x=20, y=10)

        # 地址输入按钮1
        self.but_in1 = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in1))
        self.but_in1.place(x=540, y=10)

        # 输入框2
        self.var_in2 = tk.StringVar()
        self.var_in2.set('请在此处输入文件2的地址')
        self.entry_in2 = tk.Entry(self.master, textvariable=self.var_in2, font=('Arial', 14), width=42)
        self.entry_in2.place(x=20, y=50)

        # 地址输入按钮2
        self.but_in2 = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in2))
        self.but_in2.place(x=540, y=50)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=90)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=90)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.excel_deal)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 此处解释函数意义
    def excel_deal(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')

            file_path = self.judge_input(self.var_in.get(), 'file')
            store_path = self.judge_input(self.var_out.get(), 'dir')

            file = read_excel(file_path)
            dataframe = DataFrame(file)
            dataframe = dataframe.fillna(int(0))

            pass

            self.t.insert(tk.END, "xxxxxxx\n")
            self.t.insert(tk.END, '\n\n')
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')


# 小窗口2
# 对比同一文件夹下所有学科之间的交叉数 excel_compare
class Win2(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        # self.master.geometry("900x600+200+200")
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n    1、该程序对比了同一文件夹下所有学科之间的交叉数,输出为一"
                                   "个关于各个学科交叉数目的表格 file_compare.xls\n\n"
                                   "    2、默认的输入路径为程序所在目录文件夹下的data文件夹,默认输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会依次将不为零的结果显示在右边窗口。\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框
        self.var_in = tk.StringVar()
        self.var_in.set('请在此处输入输入文件夹的地址')
        self.entry_in = tk.Entry(self.master, textvariable=self.var_in, font=('Arial', 14), width=42)
        self.entry_in.place(x=20, y=30)

        # 地址输入按钮
        self.but_in = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_in))
        self.but_in.place(x=540, y=30)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=80)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=80)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.excel_compare)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 此处解释函数意义
    def excel_compare(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')

            file_path = self.judge_input(self.var_in.get(), 'file')
            store_path = self.judge_input(self.var_out.get(), 'dir')

            file = read_excel(file_path)
            dataframe = DataFrame(file)
            dataframe = dataframe.fillna(int(0))

            pass

            self.t.insert(tk.END, "xxxxxxx\n")
            self.t.insert(tk.END, '\n\n')
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')


# 小窗口3
# 计算出研究方向编号1和研究方向编号2两列中各个不同学科的数目 def excel_cal_elem
class Win3(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n"
                                   "    1、该程序计算了研究方向编号1和研究方向编号2两列中各个不同学科的数目 并将结果制表,存为count.xls\n\n"
                                   "    2、请输入文件路径。默认的输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会依次将预览表格输出在右边窗口。\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框
        self.var_in = tk.StringVar()
        self.var_in.set('请在此处输入文件的地址')
        self.entry_in = tk.Entry(self.master, textvariable=self.var_in, font=('Arial', 14), width=42)
        self.entry_in.place(x=20, y=30)

        # 地址输入按钮
        self.but_in = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in))
        self.but_in.place(x=540, y=30)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=80)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=80)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.excel_cal_elem)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 此处解释函数意义
    def excel_cal_elem(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')

            file_path = self.judge_input(self.var_in.get(), 'file')
            store_path = self.judge_input(self.var_out.get(), 'dir')

            file = read_excel(file_path)
            dataframe = DataFrame(file)
            dataframe = dataframe.fillna(int(0))

            pass

            self.t.insert(tk.END, "xxxxxxx\n")
            self.t.insert(tk.END, '\n\n')
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')

    



if __name__ == '__main__':
    bg_width = 900
    bg_height = 600

    window = tk.Tk()
    window.title("文献对比处理软件 作者:孙麒麟")
    window.geometry(f"{bg_width}x{bg_height}+100+100")
    # 不能被调整大小
    window.resizable(False, False)
    # 设置窗口图标
    window.iconbitmap("./8.ico")

    canvas = tk.Canvas(window, width=bg_width, height=bg_height)
    # image_file = tk.PhotoImage(file='new.gif')
    im_window = get_image('1.jpg', bg_width, bg_height)
    canvas.create_image(bg_width / 2, bg_height / 2, image=im_window)
    canvas.pack()

    # 在此处选择以Win1、Win2或Win3中的一个为模板。
    self = Win3(window, 1)
    window.mainloop()

在这里插入图片描述

3、单个窗口模板2(李xinpeng)

import os.path
import tkinter as tk
from PIL import Image, ImageTk
from pandas import read_excel, DataFrame
from tkinter.scrolledtext import ScrolledText
from tkinter import filedialog as fd
import tkinter.messagebox


# 打开指定图片,缩放至自定尺寸
def get_image(filename, width, height):
    im = Image.open(filename).resize((width, height))
    return ImageTk.PhotoImage(im)


# 小窗口的父类
class Win:
    def __init__(self, master, number):
        self.master = master
        self.master.resizable(False, False)
        self.master.iconbitmap("./8.ico")

        # 这里是程序的输出窗口
        self.t = ScrolledText(self.master, height=34, width=83)
        # text最后pack
        self.t.place(x=297, y=130)
        # 输出结果对比表
        self.file_compare = DataFrame(columns=list(range(1, 23)), index=list(range(1, 23)))

        # self.master.resizable(False, False)

        # self.frame = tk.Frame(self.master)
        # self.frame.pack()

    #     self.quit = tk.Button(self.master, text=f"退出窗口{number}", font=('Arial', 14), bg='#84bf96', compound=tk.CENTER,
    #                           command=self.close_window)
    #     self.quit.pack()
    #
    # def close_window(self):
    #     self.master.destroy()
    # 获取文件夹地址
    def dir_path_get(self, _var_change):
        dir_in_path = fd.askdirectory()
        _var_change.set(dir_in_path)

    def file_path_get(self, _var_change):
        file_in_path = fd.askopenfilename()
        _var_change.set(file_in_path)

    def judge_input(self, _input, input_type, _default='./'):
        '''
        判断输入是否合法
        :param self:
        :param _input: 输入
        :param input_type: 输入类型
        :param _default: 默认输入
        :return:
        '''
        if input_type == 'file':
            result = os.path.isfile(_input)
            if not result:
                self.t.insert(tk.END, "错误:请输入正确的文件路径!\n\n")
                self.t.update()
                tk.messagebox.showerror('错误', '请输入正确的文件路径!')

            else:
                return _input
        else:
            result = os.path.isdir(_input)
            if not result:
                self.t.insert(tk.END, "将使用默认文件夹路径\n\n")
                self.t.update()
                return _default
            else:
                return _input


# 小窗口3
# 计算出研究方向编号1和研究方向编号2两列中各个不同学科的数目 def excel_cal_elem
class Win3(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n"
                                   "    1、该程序计算了粒径中位数的大小和所在的位置,并将结果存储在 输出.txt 中。\n\n"
                                   "    2、请输入输入文件路径。默认的输出路径为程序所在目录文件夹下。\n\n"
                                   "    3、在程序运行过程中,会依次将相应数据输出在右下窗口。\n\n"
                                   "    4、运行方法:点击目录按钮选择地址或在输入栏中直接输入。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框
        self.var_in = tk.StringVar()
        self.var_in.set('请在此处输入文件的地址')
        self.entry_in = tk.Entry(self.master, textvariable=self.var_in, font=('Arial', 14), width=42)
        self.entry_in.place(x=20, y=30)

        # 地址输入按钮
        self.but_in = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                compound=tk.CENTER, command=lambda: self.file_path_get(self.var_in))
        self.but_in.place(x=540, y=30)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=80)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=80)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.deal_medium)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # 处理中位数
    def deal_medium(self):
        try:

            self.t.insert(tk.END, '---------------------------------------\n')

            file_path = self.judge_input(self.var_in.get(), 'file')
            store_path = self.judge_input(self.var_out.get(), 'dir')

            file = read_excel(file_path)
            df_file = DataFrame(file)

            df_file.fillna(0)

            title1 = list(dict.values(df_file.to_dict()['Ch1 Counts']))
            title2 = list(dict.values(df_file.to_dict()['Ch1 Diameter (µm)']))

            total = sum(title1)

            sub_total = 0
            i = 0
            while True:
                sub_total += title1[i]
                if sub_total < (total / 2):
                    i += 1
                else:
                    line = i
                    break

            sum_i = 0
            for j in range(line + 1):
                sum_i += title1[j]

            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()
            with open('输出.txt', 'a+') as f:
                f.write(f'总行数:{len(title1)}\n\n')
                f.write(f'总和:{total}\n\n')
                f.write(f"excel行数:{line + 2}\n\n")
                f.write(f'该列结果:[{title2[line]}, {title1[line]}]\n\n')
                f.write(f"一半的总和:{sum_i}\n\n")

            self.t.insert(tk.END, f'总行数:{len(title1)}\n\n')
            self.t.insert(tk.END, f'总和:{total}\n\n')
            self.t.insert(tk.END, f"excel行数:{line + 2}\n\n")
            self.t.insert(tk.END, f'该列结果:[{title2[line]}, {title1[line]}]\n\n')
            self.t.insert(tk.END, f"一半的总和:{sum_i}\n\n")
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入文件!\n\n')


if __name__ == '__main__':
    bg_width = 900
    bg_height = 600

    window = tk.Tk()
    window.title("文献对比处理软件 作者:xxx")
    window.geometry(f"{bg_width}x{bg_height}+100+100")
    # 不能被调整大小
    window.resizable(False, False)
    # 设置窗口图标
    window.iconbitmap("./8.ico")

    canvas = tk.Canvas(window, width=bg_width, height=bg_height)
    im_window = get_image('1.jpg', bg_width, bg_height)
    canvas.create_image(bg_width / 2, bg_height / 2, image=im_window)
    canvas.pack()

    # 在此处选择以Win1、Win2或Win3中的一个为模板。
    self = Win3(window, 1)
    window.mainloop()

在这里插入图片描述

4、百度图片爬虫软件模板

import os.path
import tkinter as tk
from PIL import Image, ImageTk
from pandas import read_excel, DataFrame
from tkinter.scrolledtext import ScrolledText
from tkinter import filedialog as fd
import tkinter.messagebox
import requests
import re


# 打开指定图片,缩放至自定尺寸
def get_image(filename, width, height):
    im = Image.open(filename).resize((width, height))
    return ImageTk.PhotoImage(im)


# 小窗口的父类
class Win:
    def __init__(self, master, number):
        self.master = master

        # 这里是程序的输出窗口
        self.t = ScrolledText(self.master, height=34, width=83)
        # text最后pack
        self.t.place(x=297, y=130)
        # 输出结果对比表
        self.file_compare = DataFrame(columns=list(range(1, 23)), index=list(range(1, 23)))

        # 输入框1
        self.var_in1 = tk.StringVar()
        # 输入框2
        self.var_in2 = tk.StringVar()

    def input1_comfirm(self, _var_change):
        self.var_in1.set('')

    def input2_comfirm(self, _var_change):
        self.var_in2.set('')

    # 获取文件夹地址
    def dir_path_get(self, _var_change):
        dir_in_path = fd.askdirectory()
        _var_change.set(dir_in_path)

    def judge_input(self, _input, input_type, _default='./image'):
        '''
        判断输入是否合法
        :param self:
        :param _input: 输入
        :param input_type: 输入类型
        :param _default: 默认输入
        :return:
        '''
        if input_type == 'dir':
            result = os.path.isdir(_input)
            if not result:
                self.t.insert(tk.END, "将使用默认文件夹路径\n\n")
                self.t.update()
                return _default
            else:
                return _input
        else:
            result = os.path.isfile(_input)
            if not result:
                self.t.insert(tk.END, "程序报错!请检查输入是否正确!\n\n")
                self.t.update()
                tk.messagebox.showerror('错误', '程序报错!请检查输入是否正确!')

            else:
                return _input


# 爬取百度中输入关键字的若干图片,图片数目由第二个输入框规定
class Win1(Win):
    def __init__(self, master, number):
        super().__init__(master, number)
        # self.master.geometry("900x600+200+200")
        self.meg = tk.Message(self.master, font=('Arial', 14), width=250,
                              text="程序相关介绍:\n\n    1、该程序的作用是爬取百度中输入关键字的若干图片,图片数目由第二个输入框规定。最终存储爬取图片。\n\n"
                                   "    2、请输入爬取的关键字和爬取页数。默认输出路径为程序所在目录的image文件夹下。\n\n"
                                   "    3、在程序运行过程中,会在右边窗口显示程序运行状态\n\n"
                                   "    4、运行方法:点击清除按钮清除框内文本,在输入栏中直接输入要求内容。然后点击运行开始运行程序。")
        self.meg.place(x=20, y=130)

        # 输入框1
        self.var_in1.set('请输入图片关键字:')
        self.entry_in1 = tk.Entry(self.master, textvariable=self.var_in1, font=('Arial', 14), width=42)
        self.entry_in1.place(x=20, y=10)

        # 地址输入按钮1
        self.but_in1 = tk.Button(self.master, text='清除', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.input1_comfirm(self.var_in1))
        self.but_in1.place(x=540, y=10)

        # 输入框2
        self.var_in2.set('请输入爬取图片的页面数(每个页面有60张图片):')
        self.entry_in2 = tk.Entry(self.master, textvariable=self.var_in2, font=('Arial', 14), width=42)
        self.entry_in2.place(x=20, y=50)

        # 地址输入按钮2
        self.but_in2 = tk.Button(self.master, text='清除', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.input2_comfirm(self.var_in2))
        self.but_in2.place(x=540, y=50)

        # 输出框
        self.var_out = tk.StringVar()
        self.var_out.set('请在此处输入输出文件的文件夹地址')
        self.entry_out = tk.Entry(self.master, textvariable=self.var_out, font=('Arial', 14), width=42)
        self.entry_out.place(x=20, y=90)

        # 地址输出按钮
        self.but_out = tk.Button(self.master, text='目录', font=('Arial', 10), bg='#84bf96', width=6,
                                 compound=tk.CENTER, command=lambda: self.dir_path_get(self.var_out))
        self.but_out.place(x=540, y=90)

        # 程序运行按钮
        self.but_start = tk.Button(self.master, text='运  行', font=('Arial', 22), bg='#84bf96', width=8, height=2,
                                   compound=tk.CENTER, command=self.spider_main)
        self.but_start.place(x=670, y=20)

        self.master.mainloop()

    # -----------------------------------------------------------------------------------------
    # 此处为爬虫的主函数
    def spider_main(self):
        try:
            self.t.insert(tk.END, '---------------------------------------\n')
            self.t.insert(tk.END, f'输入的关键字为:{self.var_in1.get()}\n\n')
            self.t.insert(tk.END, f'爬虫将从第一页爬取至第{self.var_in2.get()}页。\n\n')

            store_path = self.judge_input(self.var_out.get(), 'dir')

            headers = {
                'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.125 Safari/537.36'}
            name = self.var_in1.get()
            num = 0
            num_1 = 0
            num_2 = 0
            x = int(self.var_in2.get())
            list_1 = []
            for i in range(int(x)):
                name_2 = store_path
                url = 'https://image.baidu.com/search/flip?tn=baiduimage&ie=utf-8&word=' + name + '&pn=' + str(i * 20)
                res = requests.get(url, headers=headers)
                htlm_1 = res.content.decode()
                a = re.findall('"objURL":"(.*?)",', htlm_1)
                if not os.path.exists(name_2):
                    os.makedirs(name_2)
                for b in a:
                    try:
                        b_1 = re.findall('https:(.*?)&', b)
                        b_2 = ''.join(b_1)
                        if b_2 not in list_1:
                            num = num + 1
                            img = requests.get(b)
                            f = open(os.path.join(name_2, name + str(num) + '.jpg'), 'ab')
                            self.t.insert(tk.END, f'---------正在下载第{num}张图片----------\n\n')
                            self.t.see(tk.END)
                            self.t.update()
                            f.write(img.content)
                            f.close()
                            list_1.append(b_2)
                        elif b_2 in list_1:
                            num_1 = num_1 + 1
                            continue
                    except Exception as e:
                        self.t.insert(tk.END, f'---------第{num}张图片无法下载----------\n\n')
                        self.t.see(tk.END)
                        self.t.update()
                        num_2 = num_2 + 1
                        continue
            self.t.insert(tk.END,
                          '下载完成,总共下载{}张,成功下载:{}张,重复下载:{}张,下载失败:{}张\n\n'.format(num + num_1 + num_2, num, num_1, num_2))
            self.t.insert(tk.END, '程序运行结束!\n\n')
            self.t.see(tk.END)
            self.t.update()

        except:
            self.t.insert(tk.END, '程序报错!请检查输入是否正确!\n\n')
            tk.messagebox.showerror('错误', '程序报错!请检查输入是否正确!')


if __name__ == '__main__':
    bg_width = 900
    bg_height = 600

    window = tk.Tk()
    window.title("百度通用爬虫 作者:孙麒麟")
    window.geometry(f"{bg_width}x{bg_height}+100+100")
    # 不能被调整大小
    window.resizable(False, False)
    # 设置窗口图标
    window.iconbitmap("./8.ico")

    canvas = tk.Canvas(window, width=bg_width, height=bg_height)
    # image_file = tk.PhotoImage(file='new.gif')
    im_window = get_image('1.jpg', bg_width, bg_height)
    canvas.create_image(bg_width / 2, bg_height / 2, image=im_window)
    canvas.pack()

    # 在此处选择以Win1、Win2或Win3中的一个为模板。
    self = Win1(window, 1)
    window.mainloop()

在这里插入图片描述


版权声明:本文为miracleoa原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。