在大多數時候,咱們都在黑黢黢的控制檯裏執行 Python 腳本。這看起來很酷很 GEEK。但對於部分場景下的用戶來講,這樣就不大美觀和人性化了:咱們須要交互更方便的圖形化產品,也就是 GUI (圖形用戶界面,Graphical User Interface)。python
Python 有不少可實現 GUI 的庫,在以前的文章中有過一個整理:在這個什麼都看臉的時代,如何用 GUI 提升 python 程序的顏值? 但沒有針對某個具體的庫作介紹。最近有同窗提到但願給講解下 GUI 的開發,那麼今天就來作個簡單的「快速上手」。編程
而咱們要介紹的庫,就是編輯器
相比較其餘的 GUI 庫,Tkinter 有個優點在於,它是 Python 內置的 GUI 庫 ,無需另行安裝,省事了一點點。另外若是你要將開發出的程序打包成 exe,它也比第三方庫稍稍更容易一點點。ide
而功能上,Tkinter 已足夠處理大多數小型 GUI 程序的需求。其開發的程序在各主流操做系統上都可運行。Python 的內置編輯器 IDLE 就是使用 Tkinter 開發的。所以,我我的在以前的開發中,是將 Tkinter 做爲首選。函數
(固然, PyQt 也是很強大的 GUI 庫,能夠作出複雜酷炫的界面效果。而原有 QT 開發經驗的人更是很容易上手。)工具
Hello GUI Worldoop
咱們從一個最簡單的 Tkinter GUI 程序提及:佈局
import tkinter as tk root = tk.Tk() root.mainloop()
1.建立一個 Tk 窗口對象;2.調用這個對象的消息主循環。 一個窗口就出現了。在這個窗口之上,能夠添加各類輸入框、按鈕、文本等,能夠增長對各類動做的處理。優化
以往咱們寫的程序(好比猜數字、罰點球、查天氣等)大可能是有一個固定的執行流程。而 GUI 程序的不一樣之處在於,一般它們是由「 事件驅動 」的:程序運行後,至關於進入一個循環一直運行。若是你不作任何操做,這個窗口就一直在這裏。看起來是靜止的,但程序其實是在等待你的操做: _經過與窗口中的「 控件 」進行交互,好比點擊按鈕、輸入文字、勾選選項等,產生不一樣的「 事件 」,程序再根據預設的「 響應 」作處理。_就算要結束程序,也是經過「關閉窗口」和「退出」事件。人工智能
這就是 mainloop 的意義所在:監聽各類事件。理解了這一點,也就理解了 GUI 程序的基本邏輯。
所謂 控件 ,就是 GUI 圖形化界面上的對象,或者說功能元素。好比輸入框、文本框、按鈕、下拉菜單、滾動條等等,窗體自己也能夠認爲是一個控件。一個控件包含了數據和操做,決定了頁面上的元素放在哪裏、長什麼樣、有什麼樣的效果。
舉幾個 Tkinter 經常使用控件的例子:
label = tk.Label(root, text="Hello, world!") label.pack() btn = tk.Button(root, text="OK") btn.pack() entry = tk.Entry(root) entry.pack() root.mainloop()
在調用 mainloop
前,增長了 Label (文本標籤)、 Button (按鈕)、 Entry (輸入框)三個控件,經過 pack()
方法把它們添加到了窗口之上。
Tkinter 有 15 個核心控件,每一個控件有多種設置,這裏不展開介紹,網上能夠很容易搜到詳細的文檔說明。
另外除了這些基本控件以外,Tkinter 還提供了一個 ttk 模塊,增長了幾個控件並對部分已有控件進行了優化。例如:
from tkinter import ttk entry = ttk.Entry(window) entry.pack() combo = ttk.Combobox(window) combo['values'] = ('IDLE', 'PyCharm', 'VSCode', 'SublimeText') combo.pack()
完整示例代碼在文末附上。
對於控件屬性的設置,有 3 種方法:
btn = Button(root, text="Click", fg="red", bg="blue", command=click)
btn["fg"] = "green"
btn.config(fg="green", bg="yellow")
若是隻是簡單的用 pack()
方法將控件添加到窗口上,它們將按順序從上往下的放置。這顯然沒法知足複雜的需求。
Tkinter 提供了三種佈局方式:
pack 是最簡單的佈局管理方式,除了像咱們前面直接調用外,能夠加上 fill、padx、pady、ipadx、ipady、side 等參數,調整放置的邊距、填充方式、對齊方式等。
btn.pack(fill=tk.X, padx=5, pady=20, side=tk.LEFT)
用 place 替代 pack,能夠精確地指定空間的放置座標及長寬。
btn.place(x=50, y=100, width=120, height=25)
Grid 佈局的邏輯在於,將窗口像表格同樣劃分紅不一樣的格子,將控件放置進去。例如:
當控件數量衆多時,這種佈局方式更有條理。
btn.grid(row=1, column=0)
順便提一句,若是你但願能夠像 VB 那樣所見即所得地設計窗體控件,能夠了解下 Visual Tkinter 這個工具。
前面說的都是外在的形式,一個 GUI 程序要能運行,離不開內部的事件響應。即:當用戶作了一個操做,程序要作出怎樣的反應。
事件要與特定的控件相綁定,好比按鈕有點擊事件,輸入框有按鍵事件,窗體有關閉事件等。
經常使用的 2 種綁定方法:
經過控件的 command 參數指定響應函數:
def onClick(): print('clicked!') btn = Button(root, text='click', command=onClick)
注意這裏傳遞參數時,onClick 後面不能加上括號。(思考下加與不加的區別在哪裏?)
經過 bind 方法綁定不一樣的事件:
def onButton(event): print("Clicked:", event.x, event.y) def onKey(event): print("Pressed", event.char) entry.bind('<Button-1>', onButton) entry.bind('<Key>', onKey)
控件、佈局、事件響應,就是 GUI 開發的幾個重要部分。對此有了總體認識後,剩下的就是查閱相關文檔和練習了。
若是有不理解的部分或想要深刻了解的細節問題,能夠在咱們的 論壇 http:// bbs.crossincode.com 上發帖討論,或在 知識星球 上提問。
運用上述內容,咱們把課程最初的猜數字遊戲改爲一個 GUI 版本。
獲取詳細代碼,請在公衆號( Crossin的編程教室 )裏回覆關鍵字 GUI
【 課後做業 】實現一個簡單的 GUI 程序,猜數字或者一個簡單的登陸框、一個小計算器等等,能夠用 Tkinter,也能夠用其餘 GUI 庫。歡迎留言你的代碼,或發在論壇上。
下課!
════
其餘文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺
歡迎搜索及關注: Crossin的編程教室