Python 升級之路( Lv18 ) GUI 編程
棲息于阿拉德大陸上空的海洋——天空之海的巨大生物。據(jù)說它的體積甚至超過周邊的大陸,每次它飛行的時候,就像看到一塊巨大的陸地在移動。有傳聞?wù)f,天帷巨獸每300年會穿過天空之海降落到大陸上休息。??
在天帷巨獸的背部形成的島嶼上,殘留著大量不知年代的文明遺跡。探索家萊斯利?貝伊蘭斯發(fā)現(xiàn)之后,被深深的吸引。從那以后,他開始乘坐天帷巨獸到處周游世界,并且還在巨獸的背上創(chuàng)建了GBK教。
常用的GUI庫
- Tkinter tkinter(Tk interface) 是 Python 的標準 GUI 庫,支持跨平臺的 GUI 程序開發(fā). tkinter 適合小型的 GUI 程序編寫,也特別適合初學(xué)者學(xué)習(xí) GUI 編程. 本章以 tkinter 為核心來進行學(xué)習(xí)
- wxPythonwxPython 是比較流行的 GUI 庫,適合大型應(yīng)用程序開發(fā),功能強于 tkinter,整體設(shè)計 框架類似于 MFC(Microsoft Foundation Classes 微軟基礎(chǔ)類庫)
- PyQT Qt 是一種開源的 GUI 庫,適合大型 GUI 程序開發(fā),PyQT 是 Qt 工具包標準的 Python 實現(xiàn). 我們也可以使用 Qt Desginer 界面設(shè)計器快速開發(fā) GUI 應(yīng)用程序
tkinter 模塊
本章中,涉及大量的 API 講解。學(xué)習(xí) API 最好的來源就是官方提供的文檔:tkinter 官網(wǎng) 傳送門tkinter 中文文檔 傳送門tkinter 菜鳥教程 傳送門
程序開發(fā)步驟
(1)) 創(chuàng)建應(yīng)用程序主窗口對象(也稱:根窗口)
# import tkinter
from tkinter import *
root = Tk()
ps: 我們可以通過 from tkinter import * 來手動導(dǎo)入所有 tkinter 所有包, 也可以先不導(dǎo)包, 然后在提示需要導(dǎo)包導(dǎo)包時 Alt+ 回車 后選擇第一條提示自動導(dǎo)包即可。
(2) 在主窗口中,添加各種可視化組件
btn01 = Button(root)
btn01["text"] = "點擊進行抽獎"
(3) 通過幾何布局管理器,管理組件的大小和位置
btn01.pack()
(4) 事件處理(通過綁定事件處理程序,響應(yīng)用戶操作所觸發(fā)的事件)
def lottery(e): # 4.1 通過綁定事件處理程序,響應(yīng)用戶操作所觸發(fā)的事件(比如:單擊、雙擊等)
messagebox.showinfo("Message", "恭喜您中獎了, 獎勵您500萬")
print("有用戶中獎, 獎金500萬")
btn01.bind("<Button-1>", lottery)
第一個 GUI 程序
基于以上步驟, 來實現(xiàn)一個簡單的抽獎應(yīng)用。
步驟:
- 通過類 Tk 的無參構(gòu)造函數(shù)
- 在主窗口中,添加各種可視化組件
- 通過幾何布局管理器,管理組件的大小和位置
- 通過綁定事件處理程序,響應(yīng)用戶操作所觸發(fā)的事件
- 調(diào)用組件方法, 進入事件循環(huán)
實操代碼:
from tkinter import Tk, Button, messagebox
root = Tk() # 1. 通過類 Tk 的無參構(gòu)造函數(shù)
btn01 = Button(root) # 2. 在主窗口中,添加各種可視化組件,比如:按鈕(Button)、文本框(Label)等
btn01["text"] = "點擊進行抽獎"
btn01.pack() # 3. 通過幾何布局管理器,管理組件的大小和位置
def lottery(e): # 4.1 通過綁定事件處理程序,響應(yīng)用戶操作所觸發(fā)的事件(比如:單擊、雙擊等)
messagebox.showinfo("Message", "恭喜您中獎了, 獎勵您500萬")
print("有用戶中獎, 獎金500萬")
btn01.bind("<Button-1>", lottery)
root.mainloop() # 4.2 調(diào)用組件方法, 進入事件循環(huán)
結(jié)果展示:
tkinter 主窗口
通過 geometry(‘wxh±x±y’)進行設(shè)置。w 為寬度,h 為高度+x 表示距屏幕左邊的距離;-x 表示距屏幕右邊的距離;+y 表示距屏幕上邊的距離;-y 表示距屏幕下邊的距離。
from tkinter import * root = Tk()
root.title("測試主窗口的位置和大小")
root.geometry("500x400+100+200") # 寬度 500,高度 400;距屏幕左邊 100,距屏幕上邊 200
root.mainloop()
GUI 編程整體描述
tkinter 中 GUI 組件的繼承關(guān)系圖圖下圖所示:
這些類的基本作用如下:
- Misc 和 Wm:Tkinter 的 GUI 組件有兩個根父類,它們都直接繼承了 object 類:Misc:它是所有組件的根父類: Wm:它主要提供了一些與窗口管理器通信的功能函數(shù)
- TkMisc 和 Wm 派生出子類 Tk,它代表應(yīng)用程序的主窗口. 一般應(yīng)用程序都需要直接或間接 使用 Tk
- Pack、Place、GridPack、Place、Grid 是布局管理器. 布局管理器管理組件的大小、位置通過布局管理器可以將容器中的組件實現(xiàn)合理的排布
- BaseWidgetBaseWidget 是所有組件的父類
- WidgetWidget 是所有組件類的父類. Widget 一共有四個父類:BaseWidget、Pack、Grid、Place. 這意味著,所有 GUI 組件同時具備這四個父類的屬性和方法
常用組件匯總列表
GUI 應(yīng)用程序類的經(jīng)典寫法
通過類 Application 組織整個 GUI 程序,類 Application 繼承了 Frame 及通過繼承擁有 了父類的特性. 通過構(gòu)造函數(shù)__init__()初始化窗口中的對象,通過 createWidgets()方法創(chuàng)建窗口中的對象.Frame 框架是一個 tkinter 組件,表示一個矩形的區(qū)域. Frame 一般作為容器使用,可以放置其他組件,從而實現(xiàn)復(fù)雜的布局。
實操代碼:
"""測試一個經(jīng)典的 GUI 程序的寫法,使用面向?qū)ο蟮姆绞?""
import random
from tkinter import *
from tkinter import messagebox
class Application(Frame):
def __init__(self, master=None):
super().__init__(master) # super 代表的是父類的定義, 而不是父類對象
self.master = master
self.pack()
self.createWidget()
def createWidget(self):
"""創(chuàng)建組件"""
self.btn01 = Button(self)
self.btn01["text"] = "點擊抽獎"
self.btn01.pack()
self.btn01["command"] = self.lottery
"""創(chuàng)建一個退出按鈕"""
self.btnexit = Button(self, text="退出", command=root.destroy)
self.btnexit.pack()
def lottery(self):
messagebox.showinfo("點擊抽獎", "恭喜您中獎, 獎金{0}個粽子+{1}個咸鴨蛋".format(random.randint(1, 100), random.randint(1, 100)))
if __name__ == "__main__":
root = Tk()
root.geometry("400x100+810+330")
root.title("GUI應(yīng)用程序經(jīng)典寫法")
app = Application(master=root)
root.mainloop()
結(jié)果展示
在格蘭之森時, 冒險家了不起遭遇到了燃燒的森林(烈焰格拉卡)和變成僵尸的精靈(暗黑雷鳴廢墟)等異變. 在前往天 空之城攻略怪物時, 遇到了GSC , 在機緣巧合下幫助莉莉安和卡卡坤互相了解對方的心意, 在平時在冒險家酒館時還結(jié)實了老板索菲亞. 擊敗領(lǐng)主塞格哈特之后,在賽格哈特駐地的正上方,天帷巨獸正好飛過,而乘坐飛艇成功逃生的紅發(fā)少女卻因為飛艇被破壞,被迫迫降在天空之城,受傷昏迷,隨后被冒險家了不起帶回赫頓瑪爾的醫(yī)療所負責(zé)救治。??
在蘇醒后, 紅發(fā)少女介紹其自己的來歷: 她叫奧菲利亞, 是GBK教的一名成員. 由于所屬組織的很多人疑似收到了控制, 導(dǎo)致性情大變. 開始殘害同胞. 在知道了不起身份之后, 也請求了不起前去幫忙調(diào)查下情況. 于是在修理匠森納斯的幫助下, 修復(fù)飛艇之后的了不起便和奧菲利亞以及鬼劍士GSC一起去調(diào)查事件的起因了...