零基礎學習python_easygui(35課),python_easygui35
今天學習的內容我覺得還是很有意思的,當然我主要也是從這個網址學的:http://bbs.fishc.com/thread-46069-1-1.html,大家可以直接看這個網址進行學習,當然也可以看看我的總結,嘻嘻^-^
這裡就不講解安裝的方法了吧,也比較簡單,大家可以看剛剛那個網址或者百度安裝。
1、匯入模組的方式,第一種 import easygui as eg,推薦使用這種,起一個模組的別名,調用也方便也不會導致衝突;第二種是from easygui import *,這種的話不太建議,因為全部匯入後模組的方法可能會與變數名起衝突。
2、msgbox(msg='(要列印的值)', title=' ', ok_button='OK', image=None, root=None)
一般的程式第一件事情就是列印hello world,我也不例外,讓我們來列印一下hello world吧!
import easygui as egeg.msgbox('hello world')
你看就彈出下面的介面出來了,第一次看挺神奇的,嘻嘻。
對於所有的easygui的所有函數,前兩個參數是訊息和標題,剛剛我們沒有設定標題,現在我們來試下。
eg.msgbox('hello my world','我是標題,哈哈哈',ok_button='加油啊!')
看上面一行是不是多了標題呢?
3、ccbox(msg='Shall I continue?', title=' ', choices=('Continue', 'Cancel'), image=None)
在各類按鈕組件中,預設的訊息是“Shall I continue”,所以可以不帶任何參數去調用,看下面的例子:
import easygui as egdef box(): if eg.ccbox(): pass else: returnbox()
如果你看了魚C的那個網址的話,它會報"return outside function",這裡要注意下, return是返回一個方法的值,如果你沒有定義一個方法卻用return去返回的話這就坑爹了。看結果如下,點擊continue就返回True,點擊Cancel就返回Flase。
當然了,你也可以在ccbox寫內容,看下面的例子:
import easygui as egimport sysif eg.ccbox("你想要玩啥呢?","選擇",('玩遊戲','玩泥巴!')): eg.msgbox("玩毛,走吧!")else: sys.exit(0)
結果如下,這裡說一下sys.exit(0)和sys.exit()還有sys.exit(1)、sys._exit(),sys._exit()會直接將python程式終止,之後的所有代碼都不會繼續執行;sys.exit()會引發一個異常:SystemExit,如果這個異常沒有被捕獲,那麼python解譯器將會退出。如果有捕獲此異常的代碼,那麼這些代碼還是會執行。捕獲這個異常可以做一些額外的清理工作。0為正常退出,其他數值(1-127)為不正常,可拋例外狀況事件供捕獲。
4、choicebox(msg='Pick something.', title=' ', choices=()) 選擇的列表
按鈕組件方便提供使用者一個簡單的按鈕選項,但如果有很多選項,或者選項的內容特別長的話,更好的策略是為它們提供一個可選擇的列表。
choicebox() 為使用者提供了一個可選擇的列表,使用序列(元祖或列表)作為選項,這些選項顯示前會按照不區分大小寫方法排好序。
另外還可以使用鍵盤來選擇其中一個選項(比較糾結,但一點兒都不重要):
- 例如當按下鍵盤上的"g"鍵,將會選中的第一個以"g"開頭的選項。
- 再次按下"g"鍵,則會選中下一個以"g"開頭的選項。
- 在選中最後一個以"g"開頭的選項的時候,再次按下"g"鍵將重新回到在列表的開頭的第一個以"g"開頭的選項。
- 如果選項中沒有以"g"開頭的,則會選中字元排序在"g"之前("f")的那個字元開頭的選項。
- 如果選項中沒有字元的排序在"g"之前的,那麼在列表中第一個元素將會被選中。
import easygui as egmsg = "你喜歡什麼呢?"title = "my love"choice_list = ["打球","看電影","玩手機","約會"]result = eg.choicebox(msg,choices=choice_list)
顯示結果如下:
5、ynbox()
這個函數和ccbox()功能一樣,額,就不說了
6、buttonbox(msg='', title=' ', choices=('Button1', 'Button2', 'Button3'), image=None, root=None)
可以使用 buttonbox() 定義自己的一組按鈕,buttonbox() 會顯示一組你定義好的按鈕。
當使用者點擊任意一個按鈕的時候,buttonbox() 返回按鈕的常值內容。如果使用者取消取消或者關閉視窗,那麼會返回預設選項(第一個選項)(我試了下怎麼也關不掉。。。)。請看例子:
import easygui as egeg.buttonbox(msg="你喜歡下面哪種水果?",title="水果選擇",choices=("哈密瓜","蘋果","荔枝"))
結果如下,不知道為啥關不掉,只能選擇一個:
7、indexbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None)
基本跟上面一樣,區別就是當使用者選擇第一個按鈕的時候返回序號0,選擇第二個按鈕時候返回序號1。
你看傳回值不一樣而已,其餘一樣。
8、boolbox(msg='Shall I continue?', title=' ', choices=('Yes', 'No'), image=None)
如果第一個按鈕被選中則返回 1,否則返回 0。結果看看下面的例子就可以了
9、圖片調用,當你調用一個 buttonbox 函數(例如 msgbox(), ynbox(), indexbox() 等等)的時候,
你還可以為關鍵字參數 image 賦值,這是設定一個 .gif 格式的映像(注意僅支援 GIF 格式哦):
import easygui as egeg.buttonbox('請問你是誰?',image='como.jpg',choices=('左','中','右'))
10、multchoicebox(msg='Pick as many items as you like.', title=' ', choices=(), **kwargs)
multchoicebox() 函數也是提供一個可選擇的列表,與 choicebox() 不同的是,multchoicebox() 支援使用者選擇 0 個,1 個或者同時選擇多個選項。
multchoicebox() 函數也是使用序列(元祖或列表)作為選項,這些選項顯示前會按照不區分大小寫方法排好序。
大家可以看下這個可以全選也可以不選
11、enterbox(msg='Enter something.', title=' ', default='', strip=True, image=None, root=None)
enterbox() 為使用者提供一個最簡單的輸入框,傳回值為使用者輸入的字串。
預設返回的值會自動去除首尾的空格,如果需要保留首尾空格的話請設定參數 strip=False。
import easygui as egeg.enterbox("請說出你愛的人",title='大膽的說吧,放心我聽不到的!')
12、integerbox(msg='', title=' ', default='', lowerbound=0, upperbound=99, image=None, root=None, **invalidKeywordArguments)
integerbox() 為使用者提供一個簡單的輸入框,使用者只能輸入範圍內(lowerbound參數設定最小值,upperbound參數設定最大值)的整型數值,否則會要求使用者重新輸入。
import easygui as egeg.integerbox("請輸入你對自己的滿意度!",lowerbound=-100,upperbound=100)
13、passwordbox(msg='Enter your password.', title=' ', default='', image=None, root=None)
passwordbox() 跟 enterbox() 樣式一樣,不同的是使用者輸入的內容用"*"顯示出來,返回使用者輸入的字串:
import easygui as egeg.passwordbox('請輸入密碼')
14、multenterbox(msg='Fill in values for the fields.', title=' ', fields=(), values=())
multenterbox() 為使用者提供多個簡單的輸入框,要注意以下幾點:
- 如果使用者輸入的值比選項少的話,則返回列表中的值用Null 字元串填充使用者為輸入的選項。
- 如果使用者輸入的值比選項多的話,則返回的列表中的值將截斷為選項的數量。
- 如果使用者取消操作,則返回域中的列表的值或者None值
下面來做一個題目,就是達到下面這張圖的效果,帶*必填,錯了提示使用者哪裡沒填寫,直到使用者取消或者填寫了必填項:
代碼如下:
import easygui as egmsg = '[*真實姓名]為必填項。\n \n [*真實姓名]為必填項。\n \n [*手機號碼]為必填項.\n \n [*E-mail]為必填項。'title = '使用者資訊填寫'field = ('*使用者名稱','*真實姓名','固定電話','*手機號碼','QQ','*E-mail')input_value = []input_value = eg.multenterbox(msg,title,field)while True: if input_value == None: break errmsg = "" for i in range(len(input_value)): option = field[i].strip() if option[0] == "*" and input_value[i].strip() =="": errmsg += ("【%s】為必填項\n"%field[i]) eg.msgbox(errmsg) if errmsg == "": break input_value = eg.multenterbox(msg,title,field)print("您填寫的資料如下:%s" %str(input_value))
15、multpasswordbox(msg='Fill in values for the fields.', title=' ', fields=(), values=())
multpasswordbox() 跟 multenterbox() 使用相同的介面,但當它顯示的時候,最後一個輸入框顯示為密碼的形式("*"):
import easygui as egmsg ="登入"eg.multpasswordbox(msg,fields=('使用者名稱','密碼'))
下面是結果圖,跟上面的multenterbox() 基本一致。
16、textbox(msg='', title=' ', text='', codebox=0)
textbox() 函數預設會以比例字型(參數 codebox=1 設定為等寬字型)來顯示常值內容(會自動換行哦),這個函數適合用於顯示一般的書面文字。
註:text 參數(第三個參數)可以是字串類型,清單類型,或者元祖類型。
17、codebox(msg='', title=' ', text='')
codebox()以等寬字型顯示常值內容,相當於textbox(codebox=1)
18、diropenbox(msg=None, title=None, default=None)
diropenbox()函數提供了一個對話方塊,返回使用者選擇的目錄名(帶完整路徑喔),如果使用者選擇“Cancel”則返回None。
default參數用於設定預設的開啟目錄(請確保目錄已存在)
這個大家敲一下命令就知道了,再學一下開啟檔案等下做一下相關的題目就知道了。
19、fileopenbox(msg=None, title=None, default='*',filetypes=None)
fileopenbox()函數提供一個對話方塊,返回使用者選擇的檔案名稱(帶完整路徑喔),如果使用者選擇“Cancel”則返回None。
關於default參數的設定方法:
- default參數指定一個預設路徑,通常包含一個或多個萬用字元。
- 如果設定了default參數,fileopenbox()顯示預設的檔案路徑和格式。
- default預設的參數是'*',即匹配所有格式的檔案。
舉個例子:
defalut="d:/liu/hello*.py"即顯示D盤liu檔案夾下所有名字以hello開頭的python檔案
關於filetypes參數的設定方法:
- 可以包含檔案掩碼的字串列表,例如:filetypes = ["*.txt"]
- 可以是字串列表,列表的最後一項字串是檔案類型的描述,例如:filetypes = ["*.css",["*.html","HTML files"]]
20、filesavebox(msg=None, title=None, default='',filetypes=None)
filesavebox()函數提供一個對話方塊,返回使用者選擇的檔案需要儲存的路徑(帶完整路徑喔),如果使用者選擇“Cancel”則返回None。
default參數應該包含一個檔案名稱(例如當前需要儲存的檔案名稱),當然你也可以設定為空白的,或者包含一個檔案格式掩碼的萬用字元。
filetypes參數的設定方法請參考上邊。
看我這麼多,給大家個題目做做吧。
題目:1、提供一個檔案夾瀏覽器,讓使用者選擇需要開啟的文字檔,開啟並顯示檔案內容,且標題為當前檔案的名字。
自己動手後再看如下代碼:
import easygui as egimport osmsg = "你的選擇"defaluts = "D:\\*.txt"open_file = eg.fileopenbox(msg,default=defaluts)with open(open_file) as f: title = os.path.basename(open_file) msg1 = "檔案【%s】內容是:" % title text = f.read() eg.textbox(msg,title,text)
2、結合上一題再深入一點,當使用者點擊“Ok”按鈕的時候,比較當前檔案是否修改過,如果修改過,則提示“覆蓋儲存”、“放棄儲存”或“另存新檔…”,並實現相應的功能。
代碼如下:
import easygui as egimport osmsg = "你的選擇"defaluts = "D:\\*.txt"open_file = eg.fileopenbox(msg,default=defaluts)with open(open_file) as f: title = os.path.basename(open_file) msg1 = "檔案【%s】內容是:" % title old_text = f.read() new_text = eg.textbox(msg,title,old_text)if old_text != new_text[:-1]: msg = '檔案修改過,你想進行哪種操作?' choice = ('覆蓋儲存','放棄儲存','另存新檔') choice_last = eg.buttonbox(msg=msg,choices=choice) if choice_last == '覆蓋儲存': with open(open_file,'w') as f: f.write(new_text[:-1]) elif choice_last == '另存新檔': new_file = eg.filesavebox() if os.path.splitext(new_file)[1] != '.txt': new_file += '.txt' with open(new_file,'w') as f: f.write(new_text[:-1]) else: pass
3、寫一個程式統計你當前代碼總量的和,並顯示離十萬行代碼量還有多遠
- 要求一:遞迴搜尋各個檔案
- 要求二:顯示各個類型的源檔案和原始碼數量
- 要求三:顯示總行數與百分比
真心覺得這道題目不錯,大家可以仔細琢磨琢磨,嘻嘻
#coding=utf-8import osimport easygui as egdef show_result(start_dir): lines = 0 total = 0 text = "" for i in source_list: lines = source_list[i] total += lines text += "【%s】源檔案 %d 個,源檔案 %d 行\n" %(i,file_list[i],lines) title = '統計結果' msg = '你目前共累計編寫了%d 行代碼,完成進度:%.2f %%\n ,離10萬行代碼還差 %d 行,請繼續努力!'%(total,total/1000,10000-total) eg.textbox(msg,title,text) def calc_code(file_name): lines = 0 with open(file_name) as f: print('正在分析檔案:%s ...'%file_name) try: for each_line in f: lines += 1 except UnicodeDecodeError: pass #可能遇到格式不相容的檔案,這裡忽略掉 return linesdef search_file(file_path): os.chdir(file_path) for each_file in os.listdir(os.curdir): ext = os.path.splitext(each_file)[1] if ext in target: lines = calc_code(each_file) #統計行數 #還記得異常的用法嗎?如果字典中不存在,拋出KeyError,則添加字典鍵 #統計檔案數 try: file_list[ext] += 1 except KeyError: file_list[ext] = 1 #統計原始碼行數 try: source_list[ext] += lines except KeyError: source_list[ext] = lines if os.path.isdir(each_file): search_file(each_file) #遞迴調用 os.chdir(os.pardir) #遞迴完後返回上一級目錄 target = ['.c','.cpp','.py','.java','.pas']file_list = {}source_list = {}eg.msgbox("請開啟你存放所有代碼的檔案夾。。。統計代碼量")file_path = eg.diropenbox("請選擇你的程式碼程式庫:")search_file(file_path)show_result(file_path)
21、exceptionbox 捕獲異常,這個與python代碼的捕獲異常類似
import easygui as egtry: int('Exception')except: eg.exceptionbox('int類型資料轉換錯誤!請檢查您的資料類型!')