1. 程式人生 > >零基礎學習python_easygui(35課)

零基礎學習python_easygui(35課)

玩遊戲 進行 總結 xbox 文本文 就是 option 執行 空字符串

  今天學習的內容我覺得還是很有意思的,當然我主要也是從這個網址學的: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 eg
eg.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 eg
def box():
    if eg.ccbox():
        pass
    else:
        return
box()

如果你看了魚C的那個網址的話,它會報"return outside function",這裏要註意下, return是返回一個方法的值,如果你沒有定義一個方法卻用return去返回的話這就坑爹了。看結果如下,點擊continue就返回True,點擊Cancel就返回Flase。

技術分享

當然了,你也可以在ccbox寫內容,看下面的例子:

import easygui as eg
import sys

if 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 eg

msg = "你喜歡什麽呢?"
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 eg
eg.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 eg
eg.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 eg
eg.enterbox("請說出你愛的人",title=大膽的說吧,放心我聽不到的!)

技術分享

12、integerbox(msg=‘‘, title=‘ ‘, default=‘‘, lowerbound=0, upperbound=99, image=None, root=None, **invalidKeywordArguments)

integerbox() 為用戶提供一個簡單的輸入框,用戶只能輸入範圍內(lowerbound參數設置最小值,upperbound參數設置最大值)的整型數值,否則會要求用戶重新輸入。

import easygui as eg
eg.integerbox("請輸入你對自己的滿意度!",lowerbound=-100,upperbound=100)

技術分享

13、passwordbox(msg=‘Enter your password.‘, title=‘ ‘, default=‘‘, image=None, root=None)

passwordbox() 跟 enterbox() 樣式一樣,不同的是用戶輸入的內容用"*"顯示出來,返回用戶輸入的字符串:

import easygui as eg
eg.passwordbox(請輸入密碼)

技術分享

14、multenterbox(msg=‘Fill in values for the fields.‘, title=‘ ‘, fields=(), values=())

multenterbox() 為用戶提供多個簡單的輸入框,要註意以下幾點:

  • 如果用戶輸入的值比選項少的話,則返回列表中的值用空字符串填充用戶為輸入的選項。
  • 如果用戶輸入的值比選項多的話,則返回的列表中的值將截斷為選項的數量。
  • 如果用戶取消操作,則返回域中的列表的值或者None值

下面來做一個題目,就是達到下面這張圖的效果,帶*必填,錯了提示用戶哪裏沒填寫,直到用戶取消或者填寫了必填項:

技術分享

代碼如下:

import easygui as eg

msg = [*真實姓名]為必填項。\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 eg
msg ="登錄"
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 eg
import os

msg = "你的選擇"
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 eg
import os

msg = "你的選擇"
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-8
import os
import easygui as eg

def 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 lines


def 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 eg

try:
    int(Exception)
except:
    eg.exceptionbox(int類型數據轉換錯誤!請檢查您的數據類型!)

零基礎學習python_easygui(35課)