編程入門10:Python圖形界面

上一篇:編程入門09:Python字典類型

你已經(jīng)熟悉了只在窗口中顯示一塊畫布的“海龜繪圖”,現(xiàn)在讓我們嘗試編寫更通用的圖形界面程序——使用Python標(biāo)準(zhǔn)庫中的圖形界面工具包tkinter,之前介紹的IDLE和turtle實際上都是基于tkinter實現(xiàn)的。tkinter的特點是簡單輕便、適合入門之用,今后你也可以學(xué)習(xí)其他更“高級”的第三方包來開發(fā)圖形界面——例如Spyder所使用的PyQt https://pypi.python.org/pypi/PyQt5

圖形界面的各種構(gòu)成元素統(tǒng)稱“可視化部件”(Widget),每一種部件都對應(yīng)某一種類型,首先你需要生成特定類型的部件對象,然后調(diào)用對象的方法即可任意控制圖形界面的外觀和行為了。現(xiàn)在讓我們來制作一個最簡單的圖形界面程序——只包含一個最基本的部件——“窗口”,對應(yīng)類型名為Tk。

import tkinter as tk

window = tk.Tk()  # 生成窗口對象
window.geometry("500x300")  # 設(shè)置窗口大小
window.title("簡單圖形界面程序")  # 設(shè)置窗口標(biāo)題

# 這里可以生成其他部件并放入窗口

tk.mainloop()  # 開始主循環(huán)

以上程序中生成窗口對象的“Tk()”是一種特別的函數(shù),函數(shù)名就是類型名,稱為類型的“構(gòu)造函數(shù)”、“構(gòu)造方法”或“構(gòu)造器”(Constructor),這幾個術(shù)語指的都是同一樣?xùn)|西。任何類型的對象都可以用相應(yīng)構(gòu)造器來生成——例如“int("100")”將生成一個整數(shù)“100”(如果不帶參數(shù)則是生成整數(shù)“0”)。所有對象設(shè)置完成之后執(zhí)行mainloop()函數(shù)將啟動程序的“主事件循環(huán)”,顯示定義好的圖形界面并開始用戶交互——對于這個最簡單的程序來說,你可以進(jìn)行默認(rèn)的窗口操作:移動、縮放、最小化、最大化和關(guān)閉等等。

其他常用的可視化部件有“標(biāo)簽”(Label)、“按鈕”(Button)、“輸入框”(Entry)、“文本區(qū)”(Text)等等,這些部件都不能獨立存在而是從屬于窗口這樣的“容器”,你可以使用特定的布局方法例如pack()把它們放進(jìn)容器對象,默認(rèn)從上到下放置:

label = tk.Label(window, text="測試標(biāo)簽")
label.pack()
button = tk.Button(window, text="測試按鈕")
button.pack(side="bottom")  # 放到容器底部
entry = tk.Entry(window, width=50)  # 輸入框?qū)?0字符
entry.pack()
text = tk.Text(window, width=50, height=12, background="wheat")  # 文本區(qū)寬50字符高12字符,麥色背景
text.pack()

使用網(wǎng)格布局方法grid()可以在同一行放置多個部件,但此方法不可與pack()同時使用。還有一種定位布局方法place()指定部件在容器中的絕對坐標(biāo)(原點在左上角,x軸向右,y軸向下),以下代碼改用grid()和place()調(diào)整窗口布局:

label = tk.Label(window, text="測試標(biāo)簽")
label.grid(row=0, column=0)  # 標(biāo)簽放在0行0列
button = tk.Button(window, text="測試按鈕")
button.grid(row=0, column=1)  # 按鈕放在0行1列
entry = tk.Entry(window, width=50)
entry.grid(row=1, column=0, columnspan=2, padx=20, pady=10)  # 輸入框在1行0列,橫跨兩列,橫向留空20像素,縱向留空10像素
text = tk.Text(window, width=50, height=12, background="wheat")
text.place(x=20, y=100)  # 文本區(qū)放在指定的坐標(biāo)

在生成部件對象時可以設(shè)置對象事件的處理函數(shù),實現(xiàn)各種“人機交互”功能——讓我們繼續(xù)改進(jìn)程序,為按鈕對象加入點擊事件的處理函數(shù),把你在輸入框輸入的文本添加到文本區(qū)的現(xiàn)有文本中:

"""tktest.pyw 實現(xiàn)按鈕點擊事件處理
"""
import tkinter as tk


def change(widget, var):
    """事件處理函數(shù):改變Text部件的文本
    在widget現(xiàn)有文本末尾插入新的文本var
    """
    widget.config(state="normal")
    widget.insert("end", var + "\n")
    widget.config(state="disabled")


def main():
    """主函數(shù):設(shè)置窗口部件,指定按鈕點擊事件處理函數(shù)
    """
    window = tk.Tk()
    window.geometry("400x300")
    window.title("簡單圖形界面程序")
    label = tk.Label(window, text="請輸入文本并點擊添加")
    label.grid(row=0, column=0)
    entry = tk.Entry(window, width=50)
    entry.grid(row=1, column=0, columnspan=2, padx=20, pady=10)
    text = tk.Text(window, width=50, height=12, background="wheat")
    text.config(state="disabled")
    text.place(x=20, y=100)
    button = tk.Button(window, text="添加",
                       command=lambda: change(text, entry.get()))
    button.grid(row=0, column=1)
    tk.mainloop()


if __name__ == "__main__":
    main()

接下來的示例是一個圖片查看器——顯示圖片需要配合使用“畫布”(Canvas)和“圖像”(PhotoImage)部件(tkinter支持的圖片格式有PNG和GIF等),這個程序還引入了tkinter包中的另一個模塊filedialog以便顯示標(biāo)準(zhǔn)的打開文件對話框:

"""tkimage.pyw 簡單的圖片查看器
"""
import tkinter as tk
import tkinter.filedialog as fd


def openimage(canvas):
    """事件處理函數(shù):使用文件對話框打開圖片
    """
    filename = fd.askopenfilename(filetypes=[("PNG圖片", "*.png"),
                                             ("GIF圖片", "*.gif")])
    global image  # 注意這個需要定義為全局變量
    image = tk.PhotoImage(file=filename)
    canvas.create_image((0, 0), image=image, anchor="nw")


def main():
    """主函數(shù):設(shè)置窗口部件,指定按鈕點擊事件處理函數(shù)
    """
    window = tk.Tk()
    window.geometry("600x480")
    window.title("簡單的圖片查看器")
    canvas = tk.Canvas(window, width=600, height=440)
    canvas.pack(side="bottom")
    button = tk.Button(window, text="打開圖片",
                       command=lambda: openimage(canvas))
    button.pack()
    tk.mainloop()


if __name__ == "__main__":
    main()
10_image.png

這個圖片查看器確實很簡單,你可以嘗試?yán)^續(xù)改進(jìn)……有關(guān)tkinter的詳情可以查看官方文檔 https://docs.python.org/3.6/library/tkinter.html

——編程原來是這樣……

編程小提示

你已經(jīng)看到tkinter所支持的圖像功能和文件格式非常有限,如果你需要處理JPG等其他常用圖片文件格式,可以安裝第三方包“pillow”(Python Imaging Library,簡稱PIL)——注意:軟件包名是pillow而模塊名是PIL:

from PIL import Image, ImageTk

# image = tk.PhotoImage(file=filename)  這一句改為下面這兩句
image = Image.open(filename)
image = ImageTk.PhotoImage(image)

canvas.create_image((0, 0), image=image, anchor="nw")

修改后的程序就可以打開幾乎任何格式的圖片了,有關(guān)pillow的詳情可以查看發(fā)布頁面 https://pypi.python.org/pypi/Pillow/5.1.0

下一篇:編程入門11:Python面向?qū)ο?/a>

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容