用Python制作可視化GUI界面,順便實現(xiàn)自動分類整理文件!
↑?關(guān)注 + 星標(biāo)?,每天學(xué)Python新技能
后臺回復(fù)【大禮包】送你Python自學(xué)大禮包

Gooey介紹
這里用到的是一個第三方包Gooey,它只需要一行代碼,就可以將Python程序,轉(zhuǎn)換為圖形界面應(yīng)用【加上裝飾器函數(shù), 額外添加幾個參數(shù)就可以了】
Gooey是一個Python GUI程序開發(fā)框架,基于wxPython GUI庫,使用方法類似于Python內(nèi)置CLI開發(fā)庫 argparse,用一行代碼即可快速將控制臺程序,轉(zhuǎn)換為GUI應(yīng)用程序。
官方地址:https://github.com/chriskiehl/Gooey
① 安裝方式
pip?install?Gooey
② 一個簡單的例子
Gooey 通過將一個簡單的裝飾器附加到主函數(shù)上,然后使用GooeyParser可將你所有需要用到的參數(shù),可視化為文本框、選擇框甚至是文件選擇框。
from?gooey?import?Gooey,?GooeyParser
@Gooey
def?main():
????parser?=?GooeyParser(description="My?GUI?Program!")
? parser.add_argument('Filename',?widget="FileChooser")??????#?文件選擇框
?parser.add_argument('Date',?widget="DateChooser")??????????#?日期選擇框
?args?=?parser.parse_args()?????????????????????????????????#?接收界面?zhèn)鬟f的參數(shù)
?print(args)
if???__name__?==?'__main__':
????main()
結(jié)果如下:

我們還可以通過將參數(shù)傳遞給裝飾器,來配置不同的樣式和功能。
@Gooey(advanced=Boolean,??????????#?toggle?whether?to?show?advanced?config?or?not?
???????language=language_string,??#?Translations?configurable?via?json
???????auto_start=True,???????????#?skip?config?screens?all?together
???????target=executable_cmd,?????#?Explicitly?set?the?subprocess?executable?arguments
???????program_name='name',???????#?Defaults?to?script?name
???????program_description,???????#?Defaults?to?ArgParse?Description
???????default_size=(610,?530),???#?starting?size?of?the?GUI
???????required_cols=1,???????????#?number?of?columns?in?the?"Required"?section
???????optional_cols=2,???????????#?number?of?columns?in?the?"Optional"?section
???????dump_build_config=False,???#?Dump?the?JSON?Gooey?uses?to?configure?itself
???????load_build_config=None,????#?Loads?a?JSON?Gooey-generated?configuration
???????monospace_display=False)???#?Uses?a?mono-spaced?font?in?the?output?screen
)
上面已經(jīng)使用了兩個簡單的控件:FileChooser和 DateChooser·,分別提供了“文件選擇器”和 “日期選擇器”的功能。Gooey 中,現(xiàn)在支持的 chooser 類控件有:

配置參數(shù)主要是對Gooey界面做全局配置,配置方法如下:
@Gooey(program_name='Demo')
def?function():
????pass
和program_name參數(shù)配置一樣,Gooey 還支持很多其它配置,下面是它支持的參數(shù)列表:

案例介紹
比如我們想做一個文件整理的自動化程序,如圖所示,有這樣一堆雜亂地文件,我們需要將相同類型地文件進行分類。

此時可以思考一下,可視化界面上需要有一個文件選擇框,我們選擇好對應(yīng)文件夾之后,點擊開始,就可以實現(xiàn)最終的文件分類,豈不美哉?
那么如何使用這個庫實現(xiàn)這個功能呢?
#?導(dǎo)入相關(guān)庫
import?os
import?glob
import?shutil
from?gooey?import?Gooey,?GooeyParser
#?定義一個文件字典,不同的文件類型,屬于不同的文件夾,一共9個大類。
file_dict?=?{
????'圖片':?['jpg',?'png',?'gif',?'webp'],
????'視頻':?['rmvb',?'mp4',?'avi',?'mkv',?'flv'],
????"音頻":?['cd',?'wave',?'aiff',?'mpeg',?'mp3',?'mpeg-4'],
????'文檔':?['xls',?'xlsx',?'csv',?'doc',?'docx',?'ppt',?'pptx',?'pdf',?'txt'],
????'壓縮文件':?['7z',?'ace',?'bz',?'jar',?'rar',?'tar',?'zip',?'gz'],
????'常用格式':?['json',?'xml',?'md',?'ximd'],
????'程序腳本':?['py',?'java',?'html',?'sql',?'r',?'css',?'cpp',?'c',?'sas',?'js',?'go'],
????'可執(zhí)行程序':?['exe',?'bat',?'lnk',?'sys',?'com'],
????'字體文件':?['eot',?'otf',?'fon',?'font',?'ttf',?'ttc',?'woff',?'woff2']
}
#?定義一個函數(shù),傳入每個文件對應(yīng)的后綴。判斷文件是否存在于字典file_dict中;
#?如果存在,返回對應(yīng)的文件夾名;如果不存在,將該文件夾命名為"未知分類";
def?func(suffix):
????for?name,?type_list?in?file_dict.items():
????????if?suffix.lower()?in?type_list:
????????????return?name
????return?"未知分類"
@Gooey(encoding='utf-8',?program_name="整理文件小工具-V1.0.0\n\n公眾號:數(shù)據(jù)分析與統(tǒng)計學(xué)之美",?language='chinese')
def?start():
????parser?=?GooeyParser()
????parser.add_argument("path",?help="請選擇要整理的文件路徑:",?widget="DirChooser")??#?一定要用雙引號?不然沒有這個屬性
????args?=?parser.parse_args()
????# print(args, flush=True)??#?坑點:flush=True在打包的時候會用到
????return?args
if?__name__?==?'__main__':
????args?=?start()
????path?=?args.path
????#?遞歸獲取?"待處理文件路徑"?下的所有文件和文件夾。
????for?file?in?glob.glob(f"{path}/**/*",?recursive=True):
????????#?由于我們是對文件分類,這里需要挑選出文件來。
????????if?os.path.isfile(file):
????????????#?由于isfile()函數(shù),獲取的是每個文件的全路徑。這里再調(diào)用basename()函數(shù),直接獲取文件名;
????????????file_name?=?os.path.basename(file)
????????????suffix?=?file_name.split(".")[-1]
????????????#?判斷?"文件名"?是否在字典中。
????????????name?=?func(suffix)
????????????#?print(func(suffix))
????????????#?根據(jù)每個文件分類,創(chuàng)建各自對應(yīng)的文件夾。
????????????if?not?os.path.exists(f"{path}\\{name}"):
????????????????os.mkdir(f"{path}\\{name}")
????????????#?將文件復(fù)制到各自對應(yīng)的文件夾中。
????????????shutil.copy(file,?f"{path}\\{name}")
最終效果如下:

仔細觀察上述代碼,涉及到GUI界面制作的代碼,根本沒有幾行,是不是做一個簡單的工具超方便?
注意:上述代碼請在Pycharm中實現(xiàn),貌似和jupyter notebook有沖突,運行報錯,你可以嘗試一下,如果解決了,麻煩留言告知一下,謝謝!
程序打包
"打包"就用我們最常用的pyinstaller吧!
#?安裝
pip?install?pyinstaller
#?打包時執(zhí)行命令?(其中F為大寫,w為小寫)
pyinstaller?-F?Tool.py?-w
執(zhí)行效果如下:

生成的exe文件在目錄dist下,雙擊可用。


