此處使用python自帶最易上手的tkinter模塊
參考網(wǎng)址:https://www.cnblogs.com/xiehy/p/10825970.html
功能為整合python日常自動化辦公
main.py
from LoginPage import *
#初始化Tk()
root = Tk()
#設(shè)置標(biāo)題
root.title('馮寶寶的工具箱')
#調(diào)度登錄功能類
LoginPage(root)
#進(jìn)入消息循環(huán)
root.mainloop()
LoginPage.py
from tkinter import *
from tkinter.messagebox import *
from MainPage import *
class LoginPage(object):
#對象初始化
def __init__(self, master=None):
self.root = master # 定義內(nèi)部變量root
# 設(shè)置窗口大小
width = 310
height = 200
# 獲取屏幕尺寸以計算布局參數(shù),使窗口居屏幕中央
screenwidth = self.root.winfo_screenwidth()
screenheight = self.root.winfo_screenheight()
# 設(shè)置窗口大小布局
self.root.geometry('%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2))
# 設(shè)置窗口是否可變長、寬,True:可變,F(xiàn)alse:不可變
self.root.resizable(width=False, height=False)
#設(shè)置登錄用戶名\密碼
self.username = StringVar()
self.password = StringVar()
#調(diào)度自定義函數(shù),部署窗口框架
self.createPage()
#部署窗口框架
def createPage(self):
# 創(chuàng)建Frame容器 框架控件
self.page = Frame(self.root)
#容器位置設(shè)置:pack方式,
self.page.pack() #side='left'設(shè)置主窗口位置top bottom left right
Label(self.page).grid(row=0, stick=W) #Label標(biāo)簽占一行 sticky=W 設(shè)定該值可以保證本行保持左對齊,N:北/上對齊 S:南/下對齊 W:西/左對齊 E:東/右對齊
Label(self.page, text='賬號: ').grid(row=1, stick=W, pady=10) #padx=水平邊距, pady=垂直邊距
Entry(self.page, textvariable=self.username).grid(row=1, column=1, stick=E) #輸入控件接收文本
Label(self.page, text='密碼: ').grid(row=2, stick=W, pady=10)
Entry(self.page, textvariable=self.password, show='*').grid(row=2, column=1, stick=E)
Button(self.page, text='登陸', command=self.loginCheck).grid(row=3, stick=W, pady=10)
Button(self.page, text='退出', command=self.page.quit).grid(row=3, column=1, stick=E)
#登錄驗證
def loginCheck(self):
name = self.username.get()
secret = self.password.get()
if name == '1' and secret == '1':
self.page.destroy() #當(dāng)前頁面銷毀
MainPage(self.root) #跳轉(zhuǎn)功能主頁面
else:
showinfo(title='錯誤', message='賬號或密碼錯誤!')
MainPage.py
from tkinter import *
from view import * # 菜單欄對應(yīng)的各個子頁面
class MainPage(object):
#對象初始化
def __init__(self, master=None):
self.root = master # 定義內(nèi)部變量root
# 設(shè)置窗口大小
width = 600
height = 400
# 獲取屏幕尺寸以計算布局參數(shù),使窗口居屏幕中央
screenwidth = self.root.winfo_screenwidth()
screenheight = self.root.winfo_screenheight()
# 設(shè)置窗口大小布局
self.root.geometry('%dx%d+%d+%d' % (width, height, (screenwidth-width)/2, (screenheight-height)/2))
# 設(shè)置窗口是否可變長、寬,True:可變,F(xiàn)alse:不可變
self.root.resizable(width=False, height=False)
#調(diào)度自定義函數(shù),部署窗口框架
self.createPage()
def createPage(self):
self.gnbPage = GnbFrame(self.root) # 功能包界面Frame
self.gn1Page = Gn1Frame(self.root)
self.gn2Page = Gn2Frame(self.root)
self.gn3Page = Gn3Frame(self.root)
self.gnbPage.pack() # 默認(rèn)顯示功能包界面
menubar = Menu(self.root) #菜單欄
menubar.add_command(label='功能包', command=self.gnbData)
menubar.add_command(label='自毀電腦', command=self.gn1Data)
menubar.add_command(label='超級外掛', command=self.gn2Data)
menubar.add_command(label='座椅飛天', command=self.gn3Data)
self.root['menu'] = menubar # 設(shè)置菜單欄
def gnbData(self):
self.gnbPage.pack()
self.gn1Page.pack_forget()
self.gn2Page.pack_forget()
self.gn3Page.pack_forget()
def gn1Data(self):
self.gnbPage.pack_forget()
self.gn1Page.pack()
self.gn2Page.pack_forget()
self.gn3Page.pack_forget()
def gn2Data(self):
self.gnbPage.pack_forget()
self.gn1Page.pack_forget()
self.gn2Page.pack()
self.gn3Page.pack_forget()
def gn3Data(self):
self.gnbPage.pack_forget()
self.gn1Page.pack_forget()
self.gn2Page.pack_forget()
self.gn3Page.pack()
view.py
from tkinter import *
from Modes.Md5Anal import *
from Modes.ExcelHb import *
class GnbFrame(Frame): # 繼承Frame類
def __init__(self, master=None):
Frame.__init__(self, master)
self.root = master # 定義內(nèi)部變量root
self.createPage()
def createPage(self):
Label(self).grid(row=0, stick=W, pady=10)
Label(self, text='1.表格內(nèi)容合并 ').grid(row=1, stick=W, pady=10)
Button(self, text='進(jìn)入', bg="lightblue", command=excelHb_start).grid(row=1, column=1, stick=E, pady=10) #command=excelHb_start 注意這里的excelHb_start方法不能帶括號excelHb_start() 否則會自動觸發(fā)
Label(self, text='2.圖片切兩半 ').grid(row=2, stick=W, pady=10)
Button(self, text='進(jìn)入', bg="lightblue").grid(row=2, column=1, stick=E, pady=10)
Label(self, text='3. ').grid(row=3, stick=W, pady=10)
Button(self, text='進(jìn)入', bg="lightblue").grid(row=3, column=1, stick=W, pady=10)
Label(self, text='4.文本MD5加密').grid(row=4, stick=W, pady=10)
Button(self, text='進(jìn)入',bg="lightblue", command=md5anal_start).grid(row=4, column=1, stick=W, pady=10)
class Gn1Frame(Frame): # 繼承Frame類
def __init__(self, master=None):
Frame.__init__(self, master)
self.root = master # 定義內(nèi)部變量root
self.itemName = StringVar()
self.createPage()
def createPage(self):
Frame(bg='blue')
Label(self, text='寶寶愛你呦~',font=('KAITI 12 bold'),width=20,height=5).grid(stick=W, pady=100) #padx=水平邊距, pady=垂直邊距
class Gn2Frame(Frame): # 繼承Frame類
def __init__(self, master=None):
Frame.__init__(self, master)
self.root = master # 定義內(nèi)部變量root
self.createPage()
def createPage(self):
Label(self, text='biubiubiubiu~',font=('KAITI 12 bold'),width=20,height=5).grid(stick=W, pady=100) #padx=水平邊距, pady=垂直邊距
class Gn3Frame(Frame): # 繼承Frame類
def __init__(self, master=None):
Frame.__init__(self, master)
self.root = master # 定義內(nèi)部變量root
self.createPage()
def createPage(self):
Label(self, text=' ~~~ ~~~~\n ~~~~~~~ ~~~~~~~~\n ~~~~~~~~~~ ~~~~~~~~~~~\n ~~~~~~馮馮小甜心~~~~~\n ~~~~ ~~~~\n ~~~~~~~~~~~~~~\n ~~~~~~~~~\n ~~~\n',
font=('KAITI 12 bold'),
width=40,
height=10).grid(stick=W, pady=100) #padx=水平邊距, pady=垂直邊距
Md5Anal.py
from tkinter import *
import hashlib
import time
#文本MD5加密功能包
LOG_LINE_NUM = 0
class Md5Anal():
def __init__(self,init_window_name):
self.root = init_window_name
#設(shè)置窗口
def set_init_window(self):
self.root.title("文本MD5加密") #窗口名
self.root.geometry('1068x711+400+200') #290 160為窗口大小,+10 +10 定義窗口彈出時的默認(rèn)展示位置
self.root.resizable(width=False, height=False) # 設(shè)置窗口是否可變長、寬,True:可變,F(xiàn)alse:不可變
self.root["bg"] = "WhiteSmoke" #窗口背景色,其他背景色見:blog.csdn.net/chl0000/article/details/7657887
#標(biāo)簽
self.zw_label = Label(self.root,width=4) #占位標(biāo)簽
self.zw_label.grid()
self.init_data_label = Label(self.root, text="文本輸入")
self.init_data_label.grid(row=1, column=1)
self.result_data_label = Label(self.root, text="輸出結(jié)果")
self.result_data_label.grid(row=1, column=13)
self.log_label = Label(self.root, text="日志")
self.log_label.grid(row=13, column=1)
#文本框
self.init_data_Text = Text(self.root, width=60, height=35) #原始數(shù)據(jù)錄入框
self.init_data_Text.grid(row=2, column=1, rowspan=10, columnspan=10)
self.result_data_Text = Text(self.root, width=70, height=49) #處理結(jié)果展示
self.result_data_Text.grid(row=2, column=13, rowspan=15, columnspan=10)
self.log_data_Text = Text(self.root, width=60, height=12) # 日志框
self.log_data_Text.grid(row=14, column=1, columnspan=10)
#按鈕
self.str_trans_to_md5_button = Button(self.root, text="加密", bg="lightblue", width=10,command=self.str_trans_to_md5) # 調(diào)用內(nèi)部方法 加()為直接調(diào)用
self.str_trans_to_md5_button.grid(row=6, column=12)
#功能函數(shù)
def str_trans_to_md5(self):
src = self.init_data_Text.get(1.0,END).strip().replace("\n","").encode()
if src:
try:
myMd5 = hashlib.md5()
myMd5.update(src)
myMd5_Digest = myMd5.hexdigest()
#輸出到界面
self.result_data_Text.delete(1.0,END)
self.result_data_Text.insert(1.0,myMd5_Digest)
self.write_log_to_Text("加密成功??!")
except Exception as e:
self.result_data_Text.delete(1.0,END)
self.result_data_Text.insert(1.0,"加密失敗,報錯代碼:"+e)
else:
self.write_log_to_Text("請輸入~")
#日志動態(tài)打印
def write_log_to_Text(self,logmsg):
global LOG_LINE_NUM
current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
logmsg_in = str(current_time) +":" + str(logmsg) + "\n" #換行
if LOG_LINE_NUM <= 11:
self.log_data_Text.insert(END, logmsg_in)
LOG_LINE_NUM = LOG_LINE_NUM + 1
else:
self.log_data_Text.delete(1.0,2.0)
self.log_data_Text.insert(END, logmsg_in)
def md5anal_start():
init_window = Tk() #實例化出一個父窗口
ZMJ_PORTAL = Md5Anal(init_window)
# 設(shè)置根窗口默認(rèn)屬性
ZMJ_PORTAL.set_init_window()
init_window.mainloop() #父窗口進(jìn)入事件循環(huán),可以理解為保持窗口運行,否則界面不展示
ExcelHb.py
from tkinter import *
import time
import os
import xlrd
import pandas as pd
#Excel內(nèi)容合并功能包
LOG_LINE_NUM = 0
class ExcelHb():
def __init__(self,init_window_name):
self.root = init_window_name
#設(shè)置窗口
def set_init_window(self):
self.root.title("表格內(nèi)容合并") #窗口名
self.root.geometry('1068x711+400+200') #290 160為窗口大小,+10 +10 定義窗口彈出時的默認(rèn)展示位置
self.root.resizable(width=False, height=False) # 設(shè)置窗口是否可變長、寬,True:可變,F(xiàn)alse:不可變
self.root["bg"] = "WhiteSmoke" #窗口背景色,其他背景色見:blog.csdn.net/chl0000/article/details/7657887
#標(biāo)簽
self.zw_label = Label(self.root,width=4) #占位標(biāo)簽
self.zw_label.grid()
self.init_data_label = Label(self.root, text="文本輸入")
self.init_data_label.grid(row=1, column=1)
self.result_data_label = Label(self.root, text="輸出結(jié)果")
self.result_data_label.grid(row=1, column=13)
self.log_label = Label(self.root, text="日志")
self.log_label.grid(row=13, column=1)
#文本框
self.init_data_Text = Text(self.root, width=60, height=35) #原始數(shù)據(jù)錄入框
self.init_data_Text.grid(row=2, column=1, rowspan=10, columnspan=10)
self.result_data_Text = Text(self.root, width=70, height=49) #處理結(jié)果展示
self.result_data_Text.grid(row=2, column=13, rowspan=15, columnspan=10)
self.log_data_Text = Text(self.root, width=60, height=12) # 日志框
self.log_data_Text.grid(row=14, column=1, columnspan=10)
#按鈕-功能調(diào)度
self.func_main_button = Button(self.root, text="執(zhí)行", bg="lightblue", width=10,command=self.func_main) # 調(diào)用內(nèi)部方法 加()為直接調(diào)用
self.func_main_button.grid(row=6, column=12)
#功能函數(shù)
def func_main(self):
src = self.init_data_Text.get(1.0,END).strip().replace("\n","").encode().decode()
if src:
try:
file_ph_res = os.path.dirname(src) + '\\合并后' # 取文件路徑的上級路徑,生成文件夾
wfile = file_ph_res + '\\合并后.csv'
# 若合并后文件路徑不存在,創(chuàng)建
if not os.path.isdir(file_ph_res):
os.mkdir(file_ph_res)
is_ok = 0 # 解析文件計數(shù)器
r_excel = []
for root, dirs, files in os.walk(src):
if files:
for file in files:
file_name = root + '\\' + file
if '.xls' in file_name or '.xlsx' in file_name:
self.write_log_to_Text("處理中:"+file)
for sheet_i in range(xlrd.open_workbook(file_name).nsheets):
re = xlrd.open_workbook(file_name).sheet_by_index(sheet_i)
if re.visibility == 0: # 只合并未隱藏的頁簽;0 可見 1=隱藏(可通過“用戶格式”—“工作表”—“取消隱藏”取消隱藏) 2=“非常隱藏”(只能通過VBA宏取消隱藏)
if re.nrows > 0 and re.cell(0, 0).value:
r_excel.append(pd.read_excel(file_name, sheet_i))
elif re.nrows > 0 and len(re.cell(0, 0).value) == 0:
r_excel.append(pd.read_excel(file_name, sheet_i, 1))
is_ok += 1
df = pd.DataFrame(pd.concat(r_excel)).dropna(axis=1, how='all') # axis=1指列 how=‘a(chǎn)ny’只要列中含有一個空值
df.to_csv(wfile,
header=True, # 是否保存列索引
index=False, # 是否保存?索引,保存?索引,?件被加載時,默認(rèn)?索引會作為?列
encoding="GBK")
if is_ok != 0:
self.result_data_Text.delete(1.0, END)
self.result_data_Text.insert(1.0, "合并后文件:"+wfile)
self.write_log_to_Text("解析完成,合并成功!")
else:
self.write_log_to_Text("解析失敗,未檢測到Excel!")
except Exception as e:
self.result_data_Text.delete(1.0,END)
self.result_data_Text.insert(1.0,"解析失敗,報錯代碼:"+str(e))
else:
self.result_data_Text.delete(1.0, END)
self.write_log_to_Text("請輸入~")
#日志動態(tài)打印
def write_log_to_Text(self,logmsg):
global LOG_LINE_NUM
current_time = time.strftime('%Y-%m-%d %H:%M:%S',time.localtime(time.time()))
logmsg_in = str(current_time) +":" + str(logmsg) + "\n" #換行
if LOG_LINE_NUM <= 11:
self.log_data_Text.insert(END, logmsg_in)
LOG_LINE_NUM = LOG_LINE_NUM + 1
else:
self.log_data_Text.delete(1.0,2.0)
self.log_data_Text.insert(END, logmsg_in)
def excelHb_start():
init_window = Tk() #實例化出一個父窗口
ZMJ_PORTAL = ExcelHb(init_window)
# 設(shè)置根窗口默認(rèn)屬性
ZMJ_PORTAL.set_init_window()
init_window.mainloop() #父窗口進(jìn)入事件循環(huán),可以理解為保持窗口運行,否則界面不展示