python的GUI編程

此處使用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),可以理解為保持窗口運行,否則界面不展示
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Python提供了開發(fā)圖形用戶界面(GUI)的各種方案。下面列出最重要如下: Tkinter:Tkinter的是T...
    僅此而已004閱讀 1,585評論 0 10
  • 閑話 前幾天有位人吐槽我的公眾號內(nèi)容除了爬蟲還是爬蟲,看的想吐。其實我寫爬蟲寫的也快吐了,但是限于自己水平,我現(xiàn)在...
    大鄧和他的python閱讀 4,774評論 10 16
  • Author JerryYang | 本文環(huán)境Python3.7.3 Python GUI編程-- Tkinter...
    游戲創(chuàng)作者閱讀 265評論 0 1
  • 久違的晴天,家長會。 家長大會開好到教室時,離放學(xué)已經(jīng)沒多少時間了。班主任說已經(jīng)安排了三個家長分享經(jīng)驗。 放學(xué)鈴聲...
    飄雪兒5閱讀 7,812評論 16 22
  • 今天感恩節(jié)哎,感謝一直在我身邊的親朋好友。感恩相遇!感恩不離不棄。 中午開了第一次的黨會,身份的轉(zhuǎn)變要...
    余生動聽閱讀 10,814評論 0 11

友情鏈接更多精彩內(nèi)容