圖形用戶界面(Graphical User Interface,簡稱 GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面。相比於命令行模式,更加方便用戶操作,增強用戶體驗。本文以一個簡單的登錄窗口為例,簡述GUI(圖形化用戶界面)編程的相關知識點,僅供學習分享使用,如有不足之處,還請指正。
涉及知識點
Tkinter 是 Python 的標准 GUI 庫。Python 使用 Tkinter 可以快速的創建 GUI 應用程序。由於 Tkinter 是內置到 python 的安裝包中、只要安裝好 Python 之后就能 import Tkinter 庫、而且 IDLE 也是用 Tkinter 編寫而成、相關知識點如下:
- Tk:定義一個圖形化窗口,其中title用於設置標題,geometry用於設置大小,位置,mainloop方法用於顯示界面。
- Label: 定義一個文本顯示標簽,用戶無法修改內容
- Entry: 定義一個文本框,用戶可以輸入內容。
- Button:按鈕,可以綁定單擊事件,響應用戶的操作。
- pack:布局方式的一種,默認一行一個元素,居中顯示,可以設置anchor來設置對齊方式。
登錄功能分析與設計
- 需求描述:
- 用戶需要輸入用戶名密碼,然后點擊登錄按鈕進行登錄。
- 程序設計:
- 需要兩個文本框用於輸入用戶名和密碼,以及對應的標簽
- 需要一個登錄按鈕並在單擊時響應對應事件。
- 登錄事件需要對輸入的用戶名密碼進行校驗。如不合法,需要進行提示。
- 頁面布局需要友好舒適,符合大眾審美。
程序實現步驟
如何實現一個簡單的登錄窗口,操作步驟如下:
1. 定義一個空白窗口,如下所示:
1 from tkinter import * # 引入tkinter包 2 3 app = Tk() # 定義一個界面 4 app.mainloop() # 顯示頁面
默認情況下,定義的窗口會顯示與屏幕左上方,且標題為空,如下所示:
2. 添加標題,並設置頁面大小和位置,如下所示:
1 app = Tk() # 定義一個界面 2 app.title(string='Alan.hsiang>>>系統登錄') # 設置標題 3 app.geometry('400x300+300+400') # 大小坐標設置格式 =widthxheight+x+y 4 app.mainloop()
添加標題和設置大小位置后,效果如下所示:
3. 添加頁面組成元素
當空頁面創建完成后,需要為頁面添加元素(用戶名,密碼,登錄按鈕等),如下所示:
1 app = Tk() # 定義一個界面 2 app.title(string='Alan.hsiang>>>系統登錄') # 設置標題 3 app.geometry('400x300+300+400') # 大小坐標設置格式 =widthxheight+x+y 4 name_label = Label(master=app, text='用戶名') # Label用於顯示文本內容,且用戶無法修改 5 pwd_label = Label(master=app, text='密碼') # master 用於表示對象屬於哪個容器 6 name_entry = Entry(master=app) # 文本框,用戶可以進行輸入 7 pwd_entry = Entry(master=app, show='*') # 密碼框,顯示密文,以*代替 8 login_btn = Button(master=app, text='登錄') # 登錄按鈕 9 name_label.pack(anchor=W) # pack 方式布局,默認為居中 ,一個元素一行 anchor用於設置對齊方式 10 name_entry.pack(anchor=W) 11 pwd_label.pack(anchor=W) 12 pwd_entry.pack(anchor=W) 13 login_btn.pack(anchor=W) 14 app.mainloop()
執行結果,如下所示:
4. 變更頁面布局方式
默認的pack布局方式,是比較丑的,下面采用grid方式進行布局,如下所示:
1 name_label.grid(row=0,column=0) # grid 方式布局,通過設置行列的方式布局,從0開始 2 name_entry.grid(row=0,column=1) 3 pwd_label.grid(row=1,column=0) 4 pwd_entry.grid(row=1,column=1) 5 login_btn.grid(row=2,column=1)
執行結果如下所示:
5. 繼續優化布局
通過grid布局后,雖然看起來比較接近,但是元素距離左邊太近,且控件之前太擁擠,沒有空隙,可以通過設置padx,pady來改變,如下所示:
1 name_label.grid(row=0, column=0, padx=20, pady=20) # grid 方式布局,通過設置行列的方式布局,從0開始 2 name_entry.grid(row=0, column=1) 3 pwd_label.grid(row=1, column=0) 4 pwd_entry.grid(row=1, column=1) 5 login_btn.grid(row=2, column=1, pady=20, stick=E) # stick表示靠哪邊對齊,通過N(北)S(南)W(西)E(東)來表示
設置padx,pady后,效果如下所示:
6. 添加事件
當初步完成頁面布局后,下面開始完善功能,為按鈕添加事件。
通過command屬性添加事件,如下所示:
1 # 因為python是順序執行,所以login函數定義必須在綁定事件前面 2 def login(): 3 name = name_entry.get() 4 pwd = pwd_entry.get() 5 if name == '' or pwd == '': 6 messagebox.showerror(title='錯誤', message='用戶名和密碼都不能為空!!!') 7 else: 8 if name == 'admin' and pwd == '123': 9 messagebox.showinfo(title='成功', message='登錄成功') 10 else: 11 messagebox.showerror(title='錯誤', message='用戶名和密碼錯誤!!!') 12 13 14 login_btn = Button(master=app, text='登錄', width=8, command=login) # 登錄按鈕
執行效果如下:
用戶名和密碼為空時,點擊按鈕,提示錯誤信息
當輸入正確的用戶名密碼時,提示成功,如下樹所示:
示例完整代碼
整個示例比較簡單,屬於基礎入門知識,代碼如下所示:

1 from tkinter import * # 引入tkinter包 2 from tkinter import messagebox # 引入對話框包 3 4 app = Tk() # 定義一個界面 5 app.title(string='Alan.hsiang>>>系統登錄') # 設置標題 6 app.geometry('400x300+300+400') # 大小坐標設置格式 =widthxheight+x+y 7 name_label = Label(master=app, text='用戶名') # Label用於顯示文本內容,且用戶無法修改 8 pwd_label = Label(master=app, text='密碼') # master 用於表示對象屬於哪個容器 9 10 name_entry = Entry(master=app) # 文本框,用戶可以進行輸入 11 pwd_entry = Entry(master=app, show='*') # 密碼框,顯示密文,以*代替 12 13 14 # 因為python是順序執行,所以login函數定義必須在綁定事件前面 15 def login(): 16 name = name_entry.get() 17 pwd = pwd_entry.get() 18 if name == '' or pwd == '': 19 messagebox.showerror(title='錯誤', message='用戶名和密碼都不能為空!!!') 20 else: 21 if name == 'admin' and pwd == '123': 22 messagebox.showinfo(title='成功', message='登錄成功') 23 else: 24 messagebox.showerror(title='錯誤', message='用戶名和密碼錯誤!!!') 25 26 27 login_btn = Button(master=app, text='登錄', width=8, command=login) # 登錄按鈕 28 29 # name_label.pack(anchor=W) # pack 方式布局,默認為居中 ,一個元素一行 anchor用於設置對齊方式 30 # name_entry.pack(anchor=W) 31 # pwd_label.pack(anchor=W) 32 # pwd_entry.pack(anchor=W) 33 # login_btn.pack(anchor=W) 34 35 name_label.grid(row=0, column=0, padx=20, pady=20) # grid 方式布局,通過設置行列的方式布局,從0開始 36 name_entry.grid(row=0, column=1) 37 pwd_label.grid(row=1, column=0) 38 pwd_entry.grid(row=1, column=1) 39 login_btn.grid(row=2, column=1, pady=20, stick=E) # stick表示靠哪邊對齊,通過N(北)S(南)W(西)E(東)來表示 40 41 # login_btn.bind('<Button-1>', func=login) # 綁定事件 42 43 app.mainloop()
關於更多Tkinter相關內容,可以參考菜鳥教程,里面有更詳盡的介紹。
備注
臨江仙·夜登小閣憶洛中舊游
二十余年如一夢,此身雖在堪驚。閑登小閣看新晴。古今多少事,漁唱起三更。