摘要:在這個窗口之上,可以添加各種輸入框按鈕文本等,可以增加對各種動作的處理。事件要與特定的控件相綁定,比如按鈕有點擊事件,輸入框有按鍵事件,窗體有關(guān)閉事件等。
在大多數(shù)時候,我們都在黑黢黢的控制臺里執(zhí)行 Python 腳本。這看起來很酷很 GEEK。但對于部分場景下的用戶來說,這樣就不大美觀和人性化了:我們需要交互更方便的圖形化產(chǎn)品,也就是 GUI (圖形用戶界面,Graphical User Interface)。
Python 有很多可實現(xiàn) GUI 的庫,在之前的文章中有過一個整理:在這個什么都看臉的時代,如何用 GUI 提高 python 程序的顏值? 但沒有針對某個具體的庫做介紹。最近有同學(xué)提到希望給講解下 GUI 的開發(fā),那么今天就來做個簡單的“快速上手”。
而我們要介紹的庫,就是
Tkinter相比較其他的 GUI 庫,Tkinter 有個優(yōu)勢在于,它是 Python 內(nèi)置的 GUI 庫 ,無需另行安裝,省事了一點點。另外如果你要將開發(fā)出的程序打包成 exe,它也比第三方庫稍稍更容易一點點。
而功能上,Tkinter 已足夠處理大多數(shù)小型 GUI 程序的需求。其開發(fā)的程序在各主流操作系統(tǒng)上均可運行。Python 的內(nèi)置編輯器 IDLE 就是使用 Tkinter 開發(fā)的。因此,我個人在之前的開發(fā)中,是將 Tkinter 作為首選。
(當(dāng)然, PyQt 也是很強大的 GUI 庫,可以做出復(fù)雜酷炫的界面效果。而原有 QT 開發(fā)經(jīng)驗的人更是很容易上手。)
Hello GUI World
我們從一個最簡單的 Tkinter GUI 程序說起:
import tkinter as tk root = tk.Tk() root.mainloop()
1.創(chuàng)建一個 Tk 窗口對象;2.調(diào)用這個對象的消息主循環(huán)。 一個窗口就出現(xiàn)了。在這個窗口之上,可以添加各種輸入框、按鈕、文本等,可以增加對各種動作的處理。
以往我們寫的程序(比如猜數(shù)字、罰點球、查天氣等)大多是有一個固定的執(zhí)行流程。而 GUI 程序的不同之處在于,通常它們是由“ 事件驅(qū)動 ”的:程序運行后,相當(dāng)于進入一個循環(huán)一直運行。如果你不做任何操作,這個窗口就一直在這里??雌饋硎庆o止的,但程序?qū)嶋H上是在等待你的操作: _通過與窗口中的“ 控件 ”進行交互,比如點擊按鈕、輸入文字、勾選選項等,產(chǎn)生不同的“ 事件 ”,程序再根據(jù)預(yù)設(shè)的“ 響應(yīng) ”做處理。_就算要結(jié)束程序,也是通過“關(guān)閉窗口”和“退出”事件。
這就是 mainloop 的意義所在:監(jiān)聽各種事件。理解了這一點,也就理解了 GUI 程序的基本邏輯。
控件所謂 控件 ,就是 GUI 圖形化界面上的對象,或者說功能元素。比如輸入框、文本框、按鈕、下拉菜單、滾動條等等,窗體本身也可以認為是一個控件。一個控件包含了數(shù)據(jù)和操作,決定了頁面上的元素放在哪里、長什么樣、有什么樣的效果。
舉幾個 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()
在調(diào)用 mainloop 前,增加了 Label (文本標(biāo)簽)、 Button (按鈕)、 Entry (輸入框)三個控件,通過 pack() 方法把它們添加到了窗口之上。
Tkinter 有 15 個核心控件,每個控件有多種設(shè)置,這里不展開介紹,網(wǎng)上可以很容易搜到詳細的文檔說明。
另外除了這些基本控件之外,Tkinter 還提供了一個 ttk 模塊,增加了幾個控件并對部分已有控件進行了優(yōu)化。例如:
from tkinter import ttk entry = ttk.Entry(window) entry.pack() combo = ttk.Combobox(window) combo["values"] = ("IDLE", "PyCharm", "VSCode", "SublimeText") combo.pack()
完整示例代碼在文末附上。
對于控件屬性的設(shè)置,有 3 種方法:
在 創(chuàng)建 時通過 參數(shù) 設(shè)置。如 btn = Button(root, text="Click", fg="red", bg="blue", command=click)
通過 字典 的方式修改。如 btn["fg"] = "green"
通過 config 函數(shù)修改。如 btn.config(fg="green", bg="yellow")
布局如果只是簡單的用 pack() 方法將控件添加到窗口上,它們將按順序從上往下的放置。這顯然無法滿足復(fù)雜的需求。
Tkinter 提供了三種布局方式:
1. Packpack 是最簡單的布局管理方式,除了像我們前面直接調(diào)用外,可以加上 fill、padx、pady、ipadx、ipady、side 等參數(shù),調(diào)整放置的邊距、填充方式、對齊方式等。
btn.pack(fill=tk.X, padx=5, pady=20, side=tk.LEFT)2. Place
用 place 替代 pack,可以精確地指定空間的放置坐標(biāo)及長寬。
btn.place(x=50, y=100, width=120, height=25)3. Grid
Grid 布局的邏輯在于,將窗口像表格一樣劃分成不同的格子,將控件放置進去。例如:
當(dāng)控件數(shù)量眾多時,這種布局方式更有條理。
btn.grid(row=1, column=0)
順便提一句,如果你希望可以像 VB 那樣所見即所得地設(shè)計窗體控件,可以了解下 Visual Tkinter 這個工具。
事件前面說的都是外在的形式,一個 GUI 程序要能運行,離不開內(nèi)部的事件響應(yīng)。即:當(dāng)用戶做了一個操作,程序要做出怎樣的反應(yīng)。
事件要與特定的控件相綁定,比如按鈕有點擊事件,輸入框有按鍵事件,窗體有關(guān)閉事件等。
常用的 2 種綁定方法:
1. command通過控件的 command 參數(shù)指定響應(yīng)函數(shù):
def onClick(): print("clicked!") btn = Button(root, text="click", command=onClick)
注意這里傳遞參數(shù)時,onClick 后面不能加上括號。(思考下加與不加的區(qū)別在哪里?)
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)
控件、布局、事件響應(yīng),就是 GUI 開發(fā)的幾個重要部分。對此有了整體認識后,剩下的就是查閱相關(guān)文檔和練習(xí)了。
如果有不理解的部分或想要深入了解的細節(jié)問題,可以在我們的 論壇 http:// bbs.crossincode.com 上發(fā)帖討論,或在 知識星球 上提問。
運用上述內(nèi)容,我們把課程最初的猜數(shù)字游戲改成一個 GUI 版本。
獲取詳細代碼,請在公眾號( Crossin的編程教室 )里回復(fù)關(guān)鍵字 GUI
【 課后作業(yè) 】實現(xiàn)一個簡單的 GUI 程序,猜數(shù)字或者一個簡單的登錄框、一個小計算器等等,可以用 Tkinter,也可以用其他 GUI 庫。歡迎留言你的代碼,或發(fā)在論壇上。
下課!
════
其他文章及回答:
如何自學(xué)Python | 新手引導(dǎo) | 精選Python問答 | Python單詞表 | 知乎下載器 | 人工智能 | 嘻哈 | 爬蟲 | 我用Python | 高考 | requests | AI平臺
歡迎搜索及關(guān)注: Crossin的編程教室
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/42504.html
Python GUI圖形用戶界面,指的是在Python中,采用圖形的形式,去操作相關(guān)的一些用戶界面,這么說的話,比較簡單的。大家想不想搞清楚,它到底本質(zhì)上的樣子是什么呢?下面就給大家做個解答?! UI介紹 圖形用戶界面(Graphical User Interface,簡稱GUI,又稱圖形用戶接口)是指采用圖形方式顯示的計算機操作用戶界面。圖形用戶界面是一種人與計算機通信的界面顯示格式,允...
摘要:已獲原作者授權(quán)原系列地址下面我們將以中最簡單的控件控件開始這個系列的教程在中控件用以顯示文字和圖片通常被用來展示信息而非與用戶交互譯者注也可以綁定點擊等事件只是通常不這么用程序員的教程怎么能少了我們尊重這個傳統(tǒng)但我們不說讓我們來秀出吧下面的 已獲原作者授權(quán). 原系列地址: Python Tkinter Hello Tkinter Label 下面我們將以 Tkinter 中最簡單的控...
摘要:上機實踐課程開始了嗯,老師來了之后念了下,然后說開始做吧然后就開始了的之路,以前沒接觸過的可視化界面雖然這樣很不明智但是現(xiàn)在做起來感覺寫小工具還挺方便的,當(dāng)時搜到的第一個庫便是就直接開始寫了后來發(fā)現(xiàn)很不錯的樣子,下個實驗就用吧然后關(guān)于計算器 上機實踐課程開始了,嗯,老師來了之后念了下PPT,然后說:開始做吧......... 然后就開始了Python的GUI之路,以前沒接觸過PYtho...
摘要:引言學(xué)這么久了,一直想做個界面出來,最近發(fā)現(xiàn)有個內(nèi)置庫,利用它可以很輕松做出一些簡易的界面,首先來看官方對的說明從上面描述中我們不難看出,不管你是系統(tǒng),還是系統(tǒng),它都可以生成相對應(yīng)的操作界面,這就是所謂的跨平臺。 showImg(https://segmentfault.com/img/remote/1460000018532942?w=1078&h=1076); 0.引言 學(xué)Pyth...
閱讀 1360·2021-11-23 09:51
閱讀 3526·2021-09-06 15:00
閱讀 1046·2021-08-16 10:57
閱讀 1432·2019-08-30 12:46
閱讀 986·2019-08-29 12:22
閱讀 1669·2019-08-29 11:07
閱讀 3203·2019-08-26 11:23
閱讀 3041·2019-08-23 15:14