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版权协议,转载请附上原文出处链接和本声明。