Python基礎之GUI編程


圖形用戶界面(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()
View Code

關於更多Tkinter相關內容,可以參考菜鳥教程,里面有更詳盡的介紹。

備注

臨江仙·夜登小閣憶洛中舊游

【作者】陳與義  【朝代】宋
憶昔午橋橋上飲,坐中多是豪英。長溝流月去無聲。杏花疏影里,吹笛到天明。
二十余年如一夢,此身雖在堪驚。閑登小閣看新晴。古今多少事,漁唱起三更。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM