今天,我們來使用Python完成一個小工具的製作。很簡單,就是對於攝氏溫度和華氏溫度的相互換算。但是,我們的目的是複習一下之前學過的Python中tkinter的小內容。
先來看下今天要完成的內容
界面效果
Pmw模塊
除了tkinter模塊外,我們今天還用了一個叫Pmw的模塊,它裡面有很多功能豐富的控制項,比如,常用的EntryField,就是類似我們今天Label+Entry控制項,但是它的功能比簡答二者組合的功能要豐富的多,EntryField控制項可以對於輸入進行限定,這樣就不需要我們編寫額外的代碼了。
當然,我們今天不用這個控制項了(它封裝的太簡單了,就幾個參數)。我們使用它提供的另外兩個控制項,Balloon和MessageBar控制項,來感受下它們的強大之處。Balloon,顧名思義,就是熱氣球,對於電腦的話大家第一印象是不是一個類似提示框的東西。
MessageBar這個控制項也好理解,就是信息提示條,這兩個東西就是上面圖中我用紅線框住的內容。
對於EntryField知識感興趣的小夥伴可以參見我的另外幾篇博文
使用Python製作一個GUI詞雲自動生成工具,讓你秒變數據分析大師
詳解Python文件對話框filedialog和顏色選擇colorchooser的使用
詳解GUI詞雲自動生成工具中詞雲屬性設置界面的實現(連載六)
Python自動生成詞雲工具(GUI)之數據清洗功能實現(連載五)
詳解詞雲自動生成工具的數據清洗界面製作過程(連載四)
這是個連載的內容,主要製作了一個詞雲自動生成工具,親測可用,感興趣的小夥伴可以自己敲代碼試試看,一個不錯的工具,可以擴展哦!
這幾篇連載內容裡有很多關於Pmw模塊中的控制項……
tkinter的一些技巧
對於GUI界面的製作,我們知道Python有很多庫提供了類似的功能和方法,比如wxPython、Qt、Kivy等等,而最為經典的要數我們的tkinter庫了,為什麼說它經典,因為它集成在了Python開發環境中,我們不需要額外進行安裝,而其它第三方庫都是需要安裝的。
其實說白了,tkinter庫的學習,主要是三點:
控制項、事件、布局
對於控制項屬性其實都是大同小異的,使用多了,自然而然就會了。最主要的還是要掌握好常用的事件處理機制和控制項的布局方式。
控制項的美觀布局使得程序更能面向用戶、易操作;而事件處理機制其實是程序的核心,它使得程序可用性更強(試想一大堆漂亮的按鈕如果不能點擊,那麼這些按鈕就還是沒有用處的)
tkinter中控制項的布局其實很簡單,單個控制項儘量將其放入到Frame、TopLevel這樣的容器控制項中,這樣對於控制項與控制項之間的留白就更好處理,通過設置容器控制項的relief屬性,還可以給控制項組添加一些邊框,使得程序更加美觀。
對於事件,無非就是滑鼠按下了,鍵盤鬆開了類似這樣的操作。記住幾個關鍵操作也就可以了。但是,這個裡面比較重要的就是類、方法、函數在一個控制項中是如何綁定的,同一個控制項如果同時綁定幾個方法的話,首先會調用哪個方法呢?(後續我們會討論)
布局,無非就是grid、pack、place,掌握這些就基本可以編寫一個美觀的GUI程序了
廢話不多說,我們直接看下今天的代碼
代碼實現
# coding:utf-8
import Pmw
from tkinter import *
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
def btnCalc():
if is_number(swdVar.get()) and is_number(hwdVar.get()):
print('傳入一個數值型即可,兩個都是數值沒法計算了!')
swdVar.set('')
hwdVar.set('')
elif is_number(swdVar.get()) and not is_number(hwdVar.get()):
# 攝氏溫度轉換為華氏溫度
h = 9 / 5.0 * float(swdVar.get()) + 32
hwdVar.set('{}'.format(h))
elif not is_number(swdVar.get()) and is_number(hwdVar.get()):
# 華氏溫度轉化為攝氏溫度
s = 5 / 9.0 * (float(hwdVar.get()) - 32)
swdVar.set('{}'.format(s))
else:
print("檢查填入的數值")
root = Tk()
root.title('溫度計算器')
root.geometry('400x250+100+100')
# 添加熱氣球
balloon = Pmw.Balloon(root)
# 攝氏溫度變量
swdVar = StringVar()
f1 = Frame(root, relief='groove', bd=2)
lb1 = Label(f1, text="攝氏溫度")
lb1.pack(side=LEFT, padx=5, pady=5)
swd = Entry(f1, textvariable=swdVar)
swdVar.set('輸入一個數值')
swd.pack(side=RIGHT, fill=BOTH, expand=YES, padx=5, pady=5)
f1.pack(side=TOP, fill=BOTH, expand=YES, padx=10, pady=10)
balloon.bind(swd, '攝氏溫度',
'輸入攝氏溫度,單擊計算按鈕後將轉化為華氏溫度')
# 華氏溫度變量
hwdVar = StringVar()
f2 = Frame(root, relief='groove', bd=2)
lb2 = Label(f2, text="華氏溫度")
lb2.pack(side=LEFT, padx=5, pady=5)
hwd = Entry(f2, textvariable=hwdVar)
hwd.pack(side=RIGHT, fill=BOTH, expand=YES, padx=5, pady=5)
hwdVar.set('輸入一個數值')
f2.pack(side=TOP, fill=BOTH, expand=YES, padx=10, pady=10)
balloon.bind(hwd, "華氏溫度",
"輸入華氏溫度,單擊計算按鈕後轉化為攝氏溫度")
# 下面是按鈕
f3 = Frame(root)
bcal = Button(f3, text='計算', relief='ridge', bd=2, command=btnCalc)
bcal.pack(side=LEFT, fill=BOTH, expand=YES, padx=10, pady=5)
balloon.bind(bcal, "溫度轉換",
"上面文本框中輸入任意一個單擊按鈕完成計算")
bext = Button(f3, text='退出', relief='ridge', bd=2, command=root.destroy)
bext.pack(side=RIGHT, fill=BOTH, expand=YES, padx=10, pady=5)
balloon.bind(bext, "退出程序","單擊退出程序")
f3.pack(side=TOP, fill=BOTH, expand=YES, padx=5, pady=5)
# 信息條,展示幫助信息
messageBar = Pmw.MessageBar(root,
entry_width=40,
entry_relief='groove',
labelpos='w',
label_text='提示信息:')
# 布局信息條
messageBar.pack(fill=X, expand=YES, side=BOTTOM, padx=10, pady=5)
# 綁定信息條
balloon.configure(statuscommand=messageBar.helpmessage)
root.mainloop()
好了,今天的內容就到這裡了,對於Python GUI感興趣的小夥伴們可以關注我,後續會推出更多精彩內容。本人近期也在學習一些Python編程的其它內容,會逐步跟大家分享看到的知識點和實例,有意提高Python編程能力的小夥伴一定要關注我,大家一起學習進步……
轉載請註明出處,百家號:Python高手養成。