摘要:在這個窗口之上,可以添加各種輸入框按鈕文本等,可以增加對各種動作的處理。事件要與特定的控件相綁定,比如按鈕有點擊事件,輸入框有按鍵事件,窗體有關閉事件等。
在大多數時候,我們都在黑黢黢的控制臺里執行 Python 腳本。這看起來很酷很 GEEK。但對于部分場景下的用戶來說,這樣就不大美觀和人性化了:我們需要交互更方便的圖形化產品,也就是 GUI (圖形用戶界面,Graphical User Interface)。
Python 有很多可實現 GUI 的庫,在之前的文章中有過一個整理:在這個什么都看臉的時代,如何用 GUI 提高 python 程序的顏值? 但沒有針對某個具體的庫做介紹。最近有同學提到希望給講解下 GUI 的開發,那么今天就來做個簡單的“快速上手”。
而我們要介紹的庫,就是
Tkinter相比較其他的 GUI 庫,Tkinter 有個優勢在于,它是 Python 內置的 GUI 庫 ,無需另行安裝,省事了一點點。另外如果你要將開發出的程序打包成 exe,它也比第三方庫稍稍更容易一點點。
而功能上,Tkinter 已足夠處理大多數小型 GUI 程序的需求。其開發的程序在各主流操作系統上均可運行。Python 的內置編輯器 IDLE 就是使用 Tkinter 開發的。因此,我個人在之前的開發中,是將 Tkinter 作為首選。
(當然, PyQt 也是很強大的 GUI 庫,可以做出復雜酷炫的界面效果。而原有 QT 開發經驗的人更是很容易上手。)
Hello GUI World
我們從一個最簡單的 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"
通過 config 函數修改。如 btn.config(fg="green", bg="yellow")
布局如果只是簡單的用 pack() 方法將控件添加到窗口上,它們將按順序從上往下的放置。這顯然無法滿足復雜的需求。
Tkinter 提供了三種布局方式:
1. Packpack 是最簡單的布局管理方式,除了像我們前面直接調用外,可以加上 fill、padx、pady、ipadx、ipady、side 等參數,調整放置的邊距、填充方式、對齊方式等。
btn.pack(fill=tk.X, padx=5, pady=20, side=tk.LEFT)2. Place
用 place 替代 pack,可以精確地指定空間的放置坐標及長寬。
btn.place(x=50, y=100, width=120, height=25)3. Grid
Grid 布局的邏輯在于,將窗口像表格一樣劃分成不同的格子,將控件放置進去。例如:
當控件數量眾多時,這種布局方式更有條理。
btn.grid(row=1, column=0)
順便提一句,如果你希望可以像 VB 那樣所見即所得地設計窗體控件,可以了解下 Visual Tkinter 這個工具。
事件前面說的都是外在的形式,一個 GUI 程序要能運行,離不開內部的事件響應。即:當用戶做了一個操作,程序要做出怎樣的反應。
事件要與特定的控件相綁定,比如按鈕有點擊事件,輸入框有按鍵事件,窗體有關閉事件等。
常用的 2 種綁定方法:
1. command通過控件的 command 參數指定響應函數:
def onClick(): print("clicked!") btn = Button(root, text="click", command=onClick)
注意這里傳遞參數時,onClick 后面不能加上括號。(思考下加與不加的區別在哪里?)
2. bind通過 bind 方法綁定不同的事件:
def onButton(event): print("Clicked:", event.x, event.y) def onKey(event): print("Pressed", event.char) entry.bind("", onButton) entry.bind(" ", onKey)
控件、布局、事件響應,就是 GUI 開發的幾個重要部分。對此有了整體認識后,剩下的就是查閱相關文檔和練習了。
如果有不理解的部分或想要深入了解的細節問題,可以在我們的 論壇 http:// bbs.crossincode.com 上發帖討論,或在 知識星球 上提問。
運用上述內容,我們把課程最初的猜數字游戲改成一個 GUI 版本。
獲取詳細代碼,請在公眾號( Crossin的編程教室 )里回復關鍵字 GUI
【 課后作業 】實現一個簡單的 GUI 程序,猜數字或者一個簡單的登錄框、一個小計算器等等,可以用 Tkinter,也可以用其他 GUI 庫。歡迎留言你的代碼,或發在論壇上。
下課!
════
其他文章及回答:
如何自學Python | 新手引導 | 精選Python問答 | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺
歡迎搜索及關注: Crossin的編程教室
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/42504.html
Python GUI圖形用戶界面,指的是在Python中,采用圖形的形式,去操作相關的一些用戶界面,這么說的話,比較簡單的。大家想不想搞清楚,它到底本質上的樣子是什么呢?下面就給大家做個解答。 GUI介紹 圖形用戶界面(Graphical User Interface,簡稱GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面。圖形用戶界面是一種人與計算機通信的界面顯示格式,允...
摘要:已獲原作者授權原系列地址下面我們將以中最簡單的控件控件開始這個系列的教程在中控件用以顯示文字和圖片通常被用來展示信息而非與用戶交互譯者注也可以綁定點擊等事件只是通常不這么用程序員的教程怎么能少了我們尊重這個傳統但我們不說讓我們來秀出吧下面的 已獲原作者授權. 原系列地址: Python Tkinter Hello Tkinter Label 下面我們將以 Tkinter 中最簡單的控...
摘要:上機實踐課程開始了嗯,老師來了之后念了下,然后說開始做吧然后就開始了的之路,以前沒接觸過的可視化界面雖然這樣很不明智但是現在做起來感覺寫小工具還挺方便的,當時搜到的第一個庫便是就直接開始寫了后來發現很不錯的樣子,下個實驗就用吧然后關于計算器 上機實踐課程開始了,嗯,老師來了之后念了下PPT,然后說:開始做吧......... 然后就開始了Python的GUI之路,以前沒接觸過PYtho...
摘要:引言學這么久了,一直想做個界面出來,最近發現有個內置庫,利用它可以很輕松做出一些簡易的界面,首先來看官方對的說明從上面描述中我們不難看出,不管你是系統,還是系統,它都可以生成相對應的操作界面,這就是所謂的跨平臺。 showImg(https://segmentfault.com/img/remote/1460000018532942?w=1078&h=1076); 0.引言 學Pyth...
閱讀 1295·2021-11-23 09:51
閱讀 3399·2021-09-06 15:00
閱讀 987·2021-08-16 10:57
閱讀 1370·2019-08-30 12:46
閱讀 933·2019-08-29 12:22
閱讀 1602·2019-08-29 11:07
閱讀 3146·2019-08-26 11:23
閱讀 2979·2019-08-23 15:14