1. 程式人生 > >《零基礎入門學習Python》第071講:GUI的終極選擇:Tkinter8

《零基礎入門學習Python》第071講:GUI的終極選擇:Tkinter8

雖然我們能用 tkinter 設計不少東西了,但是不少同學還是感覺對這個介面程式設計掌控得還不夠多,說白了,就是我們現在還沒辦法隨心所欲的去繪製我們想要的介面,但是不瞞你說,今天的這一節課將會給你的人生乃至人生觀帶來翻天覆地的變化,開個玩笑哈。

我們今天講解 Canvas 元件,一個可以讓你任性的元件,一個可以讓你隨心所欲去繪製介面的元件,Canvas 是一個通用的元件,通常用於顯示以及編輯圖形,你可以用它來繪製直線、三角形、矩形、多邊形甚至是繪製其他的元件都可以。在 Canvas 上繪製物件,你可以使用 create_xxx() 的方法(xxx 表示物件型別,例如線段 line,矩形 rectangle,文字 text 等)。

舉個例子:

首先,我們建立一個 Canvas 物件,叫做 w,這個物件來自於 root ,設定寬度 200,高度 100,如果就這樣執行的話,得到的就是一個空白的畫布,背景顏色和視窗的背景顏色是一樣的,所以我們看不到它在哪裡,我們可以通過設定它的 background ,設定為 white。

我們然後在它的水平方向上建立一根黃線,在中間垂直方向上繪製一條紅色的虛線,然後在中間繪製一個藍色的矩形。

黃色的橫線,起點(0,50),終點(200,50),顏色填充為 yellow。

紅色的垂線,起點(100,0),終點(100,100),顏色填充為 red,dash 用於繪製虛線。

dash 用法:

1. 繪製虛線
2. 該選項值是一個整數元組,元組中的元素分別代表短線的長度和間隔
3. 例如 (3, 5) 代表 3 個畫素的短線和 5 個畫素的間隔

繪製矩形,左下點(50,25),右上點(150,75),填充顏色為 blue

import tkinter as tk

root = tk.Tk()

w = tk.Canvas(root, width = 200, height = 100, background = "white")
w.pack()

w.create_line(0, 50, 200, 50, fill = "yellow")
w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
w.create_rectangle(50, 25, 150, 75, fill = "blue")

root.mainloop()

大家要注意的是:我們建立的 3 個物件(兩條線,一個矩形),這些物件如果沒有意外的情況,它會一直保留著,直到你去修改它們,它們就會被覆蓋,例如這兩條線,本來都是貫穿整個 Canvas 的,但是被矩形覆蓋了,那麼中間被覆蓋的位置就看不到啦。

還有一些方法提供給我們對這些物件(稱之為畫布物件)進行修改,我們可以使用 coords(),itemconfig() 和 move() 方法。我們來分別演示一下:

import tkinter as tk

root = tk.Tk()

w = tk.Canvas(root, width = 200, height = 100, background = "white")
w.pack()

line1 = w.create_line(0, 50, 200, 50, fill = "yellow")
line2 = w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
rect1 = w.create_rectangle(50, 75, 150, 25, fill = "blue")

w.coords(line1, 0, 25, 200, 25)
w.itemconfig(rect1, fill = "red")
w.delete(line2)

tk.Button(root, text = "刪除全部", command = (lambda x = "all": w.delete(x))).pack() "all"其實是一個 tag, 就是畫布所有物件
root.mainloop()

你還可以在 Canvas 上面顯示文字,可以使用 create_text() 方法。

import tkinter as tk

root = tk.Tk()

w = tk.Canvas(root, width = 200, height = 100, background = "white")
w.pack()

w.create_line(0, 0, 200, 100, fill = "green", width = 3)
w.create_line(200, 0, 0, 100, fill = "green", width = 3)
w.create_rectangle(40, 20, 160, 80, fill = "green")
w.create_rectangle(65, 35, 135, 65, fill = "yellow")

w.create_text(100, 50, text = "Python")

root.mainloop()

我們可以看到,我們設定 text 的位置為 矩形中間,文字預設是居中顯示的,你還可以通過設定 anchor 讓它 靠邊。

使用 Canvas 基本上是無所不能,無所不包的,你要畫什麼圖形都可以,比如說,畫一個圓形或者橢圓形(事實上圓形就是特殊的橢圓形),我們來舉個例子:

import tkinter as tk

root = tk.Tk()

w = tk.Canvas(root, width = 200, height = 100, background = "white")
w.pack()


w.create_rectangle(40, 20, 160, 80, dash = (4, 4))
w.create_oval(40, 20, 160, 80, fill = "pink")

w.create_text(100, 50, text = "Python")

root.mainloop()

橢圓的限制範圍的條件和矩形是一模一樣的,然後得到的橢圓就是完美的貼合這個矩形,你就明白橢圓是怎麼繪製的了。事實上,繪製橢圓是先給定一個限制矩形,然後就用橢圓來填充這個限定矩形。事實上,圓形就是特殊的橢圓,只需要把這個限定矩形改成正方形即可。

然後呢,你可能還想繪製一個多邊形,你可以使用 create_polygon() 方法,現在就來帶大家畫一個五角星,首先,要畫一個五角星,我們需要確定 5 個角的座標,高中數學只要不是體育老師教的,都知道,都能夠看得懂下面的原理圖。

我們這裡使用三角函式確定五角星5個角的位置,因為我們知道它的中心到各個點的距離是一樣的。我們就可以得到各個點的座標。將這5個點連起來就是一個五角星了。繪製一個多邊形,我們使用 create_polygon() 方法,就是依次傳入每個點的座標(A-C-E-B-D)

程式碼如下:

import tkinter as tk
import math

root = tk.Tk()

w = tk.Canvas(root, width = 200, height = 100)
w.pack()

center_x = 100
center_y = 50
r = 50

points = [
        #左上點(A)
        center_x - int(r * math.sin(2 * math.pi / 5)),
        center_y - int(r * math.cos(2 * math.pi / 5)),
        #右上點(C)
        center_x + int(r * math.sin(2 * math.pi / 5)),
        center_y - int(r * math.cos(2 * math.pi / 5)),
        #左下點(E)
        center_x - int(r * math.sin(math.pi / 5)),
        center_y + int(r * math.cos(math.pi / 5)),
        #頂點(B)
        center_x,
        center_y - r,
        #右下點(D)
        center_x + int(r * math.sin(math.pi / 5)),
        center_y + int(r * math.cos(math.pi / 5))
        ]

w.create_polygon(points, outline = "green", fill = "yellow") #fill 預設是 black ,黑色填充

root.mainloop()