2020年9月16日星期三

[課後作業] 第035講:圖形用戶界面入門:EasyGui |課後測試題及答案

[課後作業] 第035講:圖形用戶界面入門:EasyGui |課後測試題及答案




《零基礎入門學習Python》視頻下載地址:傳送門ta?"pEiC
agzf%2<Tr$Z(wUc>k]CIxYd3
動動手:來自:bbs.fishc.com
A #-L+,asSRgfUyIDExJicM
0.先練練手,把我們的剛開始的那個猜數字小遊戲加上界面吧?f2^ _.
o_kF)1g78nAtzC]PY,Z?per~"I


G&E2BJ94H}*w[=OIcK!zi
1.如下圖,實現一個用於登記用戶賬號信息的界面(如果是帶*號的必填項,要求一定要有輸入並且不能是空格)。%tmP}f6
,(M. 7B'~Y)nhiTvSsGg>@Wwe;+

,:$&ph!)%lHYR(?]P}.i;nI30A
Sn6[xG~Zr o}m;EH0p!P&
2.提供一個文件夾瀏覽框,讓用戶選擇需要打開的文本文件,打開並顯示文件內容。1sNa^rmL
*:TiG$@~d-XH1P5&OS.+syR

Y)_pNGwhJ.cBKZ^y2IAd
vQ$0o]U,`IF4%B}_5Zg=;bWj
3.在上一題的基礎上增強功能:當用戶點擊“OK”按鈕的時候,比較當前文件是否修改過,如果修改過,則提示“覆蓋保存”、”放棄保存”或“另存為…”並實現相應的功能。InJwNX9W&b
Z#{R+,8^u%[TDXl C@`Is$0
(提示:解決這道題可能需要點耐心,因為你有可能會被一個小問題卡住,但請堅持,自己想辦法找到這個小問題所在並解決它!)[qK6ygu
|]X ETjhuw3(-M=@_"GKaCFJy{Z~

d?5_]%<gAU,Z2q)MuDn4o
aE9yDt?1B!fuQhdJ"zLM= >C|3K%i6
4.寫一個程序統計你當前代碼量的總和,並顯示離十萬行代碼量還有多遠?ZobF35
M*@SDX#`Gg_oe+wJFN ;(k

  • 要求一:遞歸搜索各個文件夾
  • 要求二:顯示各個類型的源文件和源代碼數量
  • 要求三:顯示總行數與百分比

截圖一:版權屬於:bbs.fishc.com
`GnT2"l;FM|z5uv~p3H]<q

qNU+hF'jMItG5KEAi:%LSZY *1
截圖二:Powered by bbs.fishc.com
jYWG;"R9kE0bqnp,P23`({Xwlu

*@&Ero#[pW>J016n{H~)NIyCY
nWp 2A$GR[b=f|v!mL].,~IFcz&"
 5. 請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

回复您的答案即可查看參考答案! 5mZ_DHRNep
Dgh^tHTop_iIaV6myAWR1:{J 98n
&Z8[f0abnBJtY~Ck"ds}$'
動動手答案:來自:bbs.fishc.com

本帖隱藏的內容

版權屬於:bbs.fishc.com
0.先練練手,把我們的剛開始的那個猜數字小遊戲加上界面吧?.|f2`^@s
*7Pf-BqI<~b,zy.Nl?2XY
代碼清單:來自:bbs.fishc.com
@*2s46#I>9hmP)Crp^k=Tc%8a
  1. import random
  2. import easygui as g

  3. g.msgbox("嗨,歡迎進入第一個界面小遊戲^_^")
  4. secret = random.randint(1,10)

  5. msg = "不妨猜一下小甲魚現在心裡想的是哪個數字(1~10):"
  6. title = "數字小遊戲"
  7. guess = g.integerbox(msg, title, lowerbound=1, upperbound=10)

  8. while True:
  9.     if guess == secret:
  10.         g.msgbox("我草,你是小甲魚心裡的蛔蟲嗎?!")
  11.         g.msgbox("哼,猜中了也沒有獎勵!")
  12.         break
  13.     else:
  14.         if guess > secret:
  15.             g.msgbox("哥,大了大了~~~")
  16.         else:
  17.             g.msgbox("嘿,小了,小了~~~")   
  18.         guess = g.integerbox(msg, title, lowerbound=1, upperbound=10)
  19.             
  20. g.msgbox("遊戲結束,不玩啦^_^")

複製代碼

e8_=*Ofh.RGB:C}y3UQTAiJLN|p
M3g`"]N'Ey!m:Jjv1z=|}&#IlA<qP
1.實現一個用於登記用戶賬號信息的界面(如果是帶*號的必填項,要求一定要有輸入並且不能是空格)。)4u$'9n<
V9kyQ2xW'16RsIA=c(3>Mwz!
代碼清單:來自:bbs.fishc.com
b%hqF;Bk~Tj{? rL+K*Y9dz
  1. import easygui as g

  2. msg = "請填寫以下聯繫方式"
  3. title = "賬號中心"
  4. fieldNames = [" *用戶名", " *真實姓名", " 固定電話", " *手機號碼", " QQ", " *E-mail"]
  5. fieldValues = []
  6. fieldValues = g.multenterbox(msg,title, fieldNames)

  7. while 1:
  8.     if fieldValues == None:
  9.         break
  10.     errmsg = ""
  11.     for i in range(len(fieldNames)):
  12.         option = fieldNames[i].strip()
  13.         if fieldValues[i].strip() == "" and option[0] == "*":
  14.             errmsg += ('【%s】為必填項。\n\n' % fieldNames[i])
  15.     if errmsg == "":
  16.         break
  17.     fieldValues = g.multenterbox(errmsg, title, fieldNames, fieldValues)

  18. print("用戶資料如下:%s" % str(fieldValues))
  19.    
複製代碼

XlEZVL:K>1adDGq6{C+[pYH<=b*o
p%CuO&GWNsAh"VIU[53o{
2.提供一個文件夾瀏覽框,讓用戶選擇需要打開的文本文件,打開並顯示文件內容。"bmT<wB
.aKt'zQdX~Gf:Tb<8W;B@OIMe7?H{
代碼清單:來自:bbs.fishc.com
YFl4%bx>J'6Ppy&V[Mo-_va)q
  1. import easygui as g
  2. import os

  3. file_path = g.fileopenbox(default="*.txt")

  4. with open(file_path) as f:
  5.     title = os.path.basename(file_path)
  6.     msg = "文件【%s】的內容如下:" % title
  7.     text = f.read()
  8.     g.textbox(msg, title, text)
複製代碼

QuxId-UO@1%MEYq2a'f8)3G<k
f93laZ,P.Kps`NtO!_d}ne4
3.在上一題的基礎上增強功能:當用戶點擊“OK”按鈕的時候,比較當前文件是否修改過,如果修改過,則提示“覆蓋保存”、”放棄保存”或“另存為…”並實現相應的功能。zTL5AZ2{N
DCd0aVcP)NvbhXTHLE+g?";
(提示:解決這道題可能需要點耐心,因為你有可能會被一個小問題卡住,但請堅持,自己想辦法找到這個小問題所在並解決它!)&yYEciH
mur7MqYp2jiG8$,g(k<{fH"a@-d
答:這道題會出現的一個小問題就是easygui.textbox函數會在返回的字符串後邊追加一個行結束符(“\n” ),因此在比較字符串是否發生改變的時候我們需要人工將這個行結束符忽略。XUz@Es
qT!JNFz^([=K>im+C"D<n6#'$dp*xv
代碼清單:版權屬於:bbs.fishc.com
|t`)4IrX7w-q9BF2;SaNJWoCRH
  1. import easygui as g
  2. import os

  3. file_path = g.fileopenbox(default="*.txt")

  4. with open(file_path) as old_file:
  5.     title = os.path.basename(file_path)
  6.     msg = "文件【%s】的內容如下:" % title
  7.     text = old_file.read()
  8.     text_after = g.textbox(msg, title, text)
  9.    
  10. if text != text_after[:-1]:
  11.     # textbox 的返回值會追加一個換行符
  12.     choice = g.buttonbox("檢測到文件內容髮生改變,請選擇以下操作:", "警告", ("覆蓋保存", "放棄保存", "另存為..."))
  13.     if choice == "覆蓋保存":
  14.         with open(file_path, "w") as old_file:
  15.             old_file.write(text_after[:-1])
  16.     if choice == "放棄保存":
  17.         pass
  18.     if choice == "另存為...":
  19.         another_path = g.filesavebox(default=".txt")
  20.         if os.path.splitext(another_path)[1] != '.txt':
  21.             another_path += '.txt'
  22.         with open(another_path, "w") as new_file:
  23.             new_file.write(text_after[:-1])
複製代碼

md3zS$uHi1aArEv'X07TC>P5GU&-+
f>YH:Q(@h~1^qUV)}ckr?!t&I3
4.寫一個程序統計你當前代碼量的總和,並顯示離十萬行代碼量還有多遠??-D+=mG
RN'o@:cu(O5=&?{t2q>!SK[|<;QPV
  • 要求一:遞歸搜索各個文件夾
  • 要求二:顯示各個類型的源文件和源代碼數量
  • 要求三:顯示總行數與百分比

代碼清單:版權屬於:bbs.fishc.com
B_)o2^l eg<Hsd?]Zr-k.wtA~CixL
  1. import easygui as g
  2. import os

  3. def show_result(start_dir):
  4.     lines = 0
  5.     total = 0
  6.     text = ""

  7.     for i in source_list:
  8.         lines = source_list[i]
  9.         total += lines
  10.         text += "【%s】源文件%d 個,源代碼%d 行\n" % (i, file_list[i], lines)
  11.     title = '統計結果'
  12.     msg = '您目前共累積編寫了%d 行代碼,完成進度:%.2f %%\n離10 萬行代碼還差%d 行,請繼續努力!' % (total, total/1000, 100000-total)
  13.     g.textbox(msg, title, text)

  14. def calc_code(file_name):
  15.     lines = 0
  16.     with open(file_name) as f:
  17.         print('正在分析文件:%s ...' % file_name)
  18.         try:
  19.             for each_line in f:
  20.                 lines += 1
  21.         except UnicodeDecodeError:
  22.             pass # 不可避免會遇到格式不兼容的文件,這裡忽略掉......
  23.     return lines

  24. def search_file(start_dir) :
  25.     os.chdir(start_dir)
  26.    
  27.     for each_file in os.listdir(os.curdir) :
  28.         ext = os.path.splitext(each_file)[1]
  29.         if ext in target :
  30.             lines = calc_code(each_file) # 統計行數
  31.             # 還記得異常的用法嗎?如果字典中不存,拋出KeyError,則添加字典鍵
  32.             # 統計文件數
  33.             try:
  34.                 file_list[ext] += 1
  35.             except KeyError:
  36.                 file_list[ext] = 1
  37.             # 統計源代碼行數
  38.             try:
  39.                 source_list[ext] += lines
  40.             except KeyError:
  41.                 source_list[ext] = lines
  42.             
  43.         if os.path.isdir(each_file) :
  44.             search_file(each_file) # 遞歸調用
  45.             os.chdir(os.pardir) # 遞歸調用後切記返回上一層目錄
  46.             
  47. target = ['.c', '.cpp', '.py', '.cc', '.java', '.pas', '.asm']
  48. file_list = {}
  49. source_list = {}

  50. g.msgbox("請打開您存放所有代碼的文件夾......", "統計代碼量")
  51. path = g.diropenbox("請選擇您的代碼庫:")

  52. search_file(path)
  53. show_result(path)
複製代碼
5.請寫下這一節課你學習到的內容:格式不限,回憶並複述是加強記憶的好方式!

小甲魚希望你認真對待作業就像你希望小甲魚推出高質量視頻一樣渴望^_^

圖形用戶界面入門:EasyGui,也就是我們常說的GUI編程,(GUI:Graphical User Interface)。

easygui各功能的使用請查閱:EasyGui學習文檔

Powered by bbs.fishc.com

0 留言:

發佈留言