1. 程式人生 > >Python for Tkinter

Python for Tkinter

# tkinter常用元件
- 按鈕
- button(按鈕元件)
- RadioButton(單選框元件)
- CheckButton(選擇按鈕元件)
- Listbox(列表框元件)

- 文字輸入元件
- Entry(單行文字框元件)
- Text(多行文字框元件)

- 標籤元件
- Label(標籤元件,可以顯示圖片和文字)
- Message(標籤元件,可以根據內容將文字換行)

- 選單
- Menu(選單元件)
- MenuButton(選單按鈕元件,可以使用Menu代替)

- 滾動條
- scale(滑塊元件)
- Scrollbar(滾動條元件)

- 其他元件
- Canvas(畫布元件)
- Frame(框架元件,將多個元件編組)
- Toplevel(建立子視窗容器元件)

##元件佈局
- 三種佈局
- pack佈局(按照方位佈局)
- 最簡單,程式碼最少,挨個擺放,預設從上到下,系統自動擺放
- 通用方式: 元件物件.pack(設定, , ,)
- side: 停靠方位,可選值為LEFT,TOP,RIGHT,BOTTON
- fill: 填充方式,X, Y, BOTH, NONE
- expande: YES/NO
- anchor: N, E, S, W, CENTER
- ipadx: x方向的內邊距
- ipady: y。。
- padx: x方向的外邊界
- pady: y。。。
- place佈局(按照座標佈局)
- 明確方位的擺放
- 相對位置佈局,隨意改變視窗大小會導致混亂
- 使用place函式,分為絕對佈局和相對佈局
- 絕對佈局使用x,y引數
- 相對佈局使用relx,rely,relheight,relwidth
- grid(網格佈局)
- 通用方式: 元件物件.grid(設定, , ,)
- 利用row, column編號,都是從0開始
- sticky: N,E,S,W表示上下左右,用來決定元件從哪個方向開始
- 支援ipadx,padx等引數,跟pack函式含義一樣
- 支援rowspan,columnspan,表示跨行,跨列數量

## 訊息機制
- 訊息的傳遞機制
- 自動發出事件/訊息
- 訊息由系統負責傳送到佇列
- 由相關元件進行繫結/設定
- 後端自動選擇感興趣的事件並做出相應反應
- 訊息格式
- <[modifier-]---type-[detail]>
- <Button-1]>: Button表示一個按鈕事件,1代表的是滑鼠左鍵,2代表中鍵
- <KeyPress-A>: 鍵盤A鍵位
- <Control-shift-KeyPress-A>: 同時按下Control,shift,A三個鍵位


##Tkinter的繫結
- bind_all: 全域性範圍的繫結,預設的是全域性快捷鍵,比如F1是幫助文件
- bind_class: 接收三個引數,第一個是類名,第二個是事件,第三個是操作
- bind: 單獨對某一個例項繫結
- unbind: 解綁,需要一個引數,即你要解綁的那個事件
### Entry
- 輸入框,功能單一
- entry["show"] = "*",設定遮擋字元
- 案例:輸入框

## 選單
- 普通選單
- 第一個Menu類定義的是parent
- add_command 新增選單項,如果選單是頂層選單,則從左向右新增,否則就是下拉選單
- label: 指定選單項名稱
- command: 點選後響應相對應的函式
- acceletor: 快捷鍵
- underline: 制定是否選單資訊下有橫線
- menu: 屬性指定使用哪個作為頂級選單
- 級聯選單
- add_cascade: 級聯選單,作用是引出後面的選單
- add_cascade的menu屬性: 指明把選單級聯到哪個選單上
- label: 名稱
- 過程
1. 建立menu例項
2. add_command
3. add_cascade

##彈出式選單
- 彈出式選單也叫上下文選單
- 流程
1. 建立選單並向選單中新增各種功能
2. 監聽滑鼠事件
3. 如果右鍵點選,則根據位置判斷彈出
4. 呼叫Menu的pop方法
- add_separator: 新增分割符

##canvas畫布
- 畫布: 可以自由的在畫布上面繪製圖形的一個舞臺
- 通常用create_xx(說明:xx=物件型別),例如line,rectangle

畫布五角星案例:
import tkinter
import math as m

# 建立面板
baseFrame = tkinter.Tk()

# 建立畫布
cvc = tkinter.Canvas(baseFrame, width=300, height=300, background="gray")
cvc.pack()

center_x = 150
center_y = 150
r = 150

# 依次存放五個點的位置
points = [
# 左上點
center_x - int(r * m.sin(2 * m.pi / 5)),
center_y - int(r * m.cos(2 * m.pi / 5)),

# 右上點
center_x + int(r * m.sin(2 * m.pi / 5)),
center_y - int(r * m.cos(2 * m.pi / 5)),

# 左下點
center_x - int(r * m.sin(m.pi / 5)),
center_y + int(r * m.cos(m.pi / 5)),

# 頂點
center_x,
center_y - r,

# 右下點
center_x + int(r * m.sin(m.pi / 5)),
center_y + int(r * m.cos(m.pi / 5)),
]

# 建立一個多邊形
cvc.create_polygon(points, outline="white", fill="red")

# 啟動訊息迴圈
baseFrame.mainloop()