2020年9月12日星期六

71 《零基礎入門學習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
  1. import tkinter as tk
  2. root = tk.Tk()
  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")
  4. w.pack()
  5. w.create_line(0, 50, 200, 50, fill = "yellow")
  6. w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
  7. w.create_rectangle(50, 25, 150, 75, fill = "blue")
  8. root.mainloop()
大家要注意的是:我們創建的3 個對象(兩條線,一個矩形),這些對像如果沒有意外的情況,它會一直保留著,直到你去修改它們,它們就會被覆蓋,例如這兩條線,本來都是貫穿整個Canvas 的,但是被矩形覆蓋了,那麼中間被覆蓋的位置就看不到啦。
還有一些方法提供給我們對這些對象(稱之為畫布對象)進行修改,我們可以使用 coords(),itemconfig() 和move() 方法。我們來分別演示一下:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")
  4. w.pack()
  5. line1 = w.create_line(0, 50, 200, 50, fill = "yellow")
  6. line2 = w.create_line(100, 0, 100, 100, fill = "red", dash = (4, 4))
  7. rect1 = w.create_rectangle(50, 75, 150, 25, fill = "blue")
  8. w.coords(line1, 0, 25, 200, 25)
  9. w.itemconfig(rect1, fill = "red")
  10. w.delete(line2)
  11. tk.Button(root, text = "删除全部", command = (lambda x = "all": w.delete(x))).pack() "all"其实是一个 tag, 就是画布所有对象
  12. root.mainloop()
你還可以在Canvas 上面顯示文本,可以使用create_text() 方法。
  1. import tkinter as tk
  2. root = tk.Tk()
  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")
  4. w.pack()
  5. w.create_line(0, 0, 200, 100, fill = "green", width = 3)
  6. w.create_line(200, 0, 0, 100, fill = "green", width = 3)
  7. w.create_rectangle(40, 20, 160, 80, fill = "green")
  8. w.create_rectangle(65, 35, 135, 65, fill = "yellow")
  9. w.create_text(100, 50, text = "Python")
  10. root.mainloop()
我們可以看到,我們設置text 的位置為矩形中間,文本默認是居中顯示的,你還可以通過設置anchor 讓它靠邊。
使用Canvas 基本上是無所不能,無所不包的,你要畫什麼圖形都可以,比如說,畫一個圓形或者橢圓形(事實上圓形就是特殊的橢圓形),我們來舉個例子:
  1. import tkinter as tk
  2. root = tk.Tk()
  3. w = tk.Canvas(root, width = 200, height = 100, background = "white")
  4. w.pack()
  5. w.create_rectangle(40, 20, 160, 80, dash = (4, 4))
  6. w.create_oval(40, 20, 160, 80, fill = "pink")
  7. w.create_text(100, 50, text = "Python")
  8. root.mainloop()
橢圓的限制範圍的條件和矩形是一模一樣的,然後得到的橢圓就是完美的貼合這個矩形,你就明白橢圓是怎麼繪製的了。事實上,繪製橢圓是先給定一個限制矩形,然後就用橢圓來填充這個限定矩形。事實上,圓形就是特殊的橢圓,只需要把這個限定矩形改成正方形即可。
然後呢,你可能還想繪製一個多邊形,你可以使用  create_polygon() 方法,現在就來帶大家畫一個五角星,首先,要畫一個五角星,我們需要確定5個角的坐標,高中數學只要不是體育老師教的,都知道,都能夠看得懂下面的原理圖。
我們這裡使用三角函數確定五角星5個角的位置,因為我們知道它的中心到各個點的距離是一樣的。我們就可以得到各個點的坐標。將這5個點連起來就是一個五角星了。繪製一個多邊形,我們使用create_polygon() 方法,就是依次傳入每個點的坐標(ACEBD)
代碼如下:
  1. import tkinter as tk
  2. import math
  3. root = tk.Tk()
  4. w = tk.Canvas(root, width = 200, height = 100)
  5. w.pack()
  6. center_x = 100
  7. center_y = 50
  8. r = 50
  9. points = [
  10. #左上点(A)
  11. center_x - int(r * math.sin(2 * math.pi / 5)),
  12. center_y - int(r * math.cos(2 * math.pi / 5)),
  13. #右上点(C)
  14. center_x + int(r * math.sin(2 * math.pi / 5)),
  15. center_y - int(r * math.cos(2 * math.pi / 5)),
  16. #左下点(E)
  17. center_x - int(r * math.sin(math.pi / 5)),
  18. center_y + int(r * math.cos(math.pi / 5)),
  19. #顶点(B)
  20. center_x,
  21. center_y - r,
  22. #右下点(D)
  23. center_x + int(r * math.sin(math.pi / 5)),
  24. center_y + int(r * math.cos(math.pi / 5))
  25. ]
  26. w.create_polygon(points, outline = "green", fill = "yellow") #fill 默认是 black ,黑色填充
  27. root.mainloop()


0 留言:

發佈留言