語法 |
作用 |
time = StringVar() |
聲明字符串鈎子 |
time.set('1') |
設置初始值 |
import tkinter as tk
from tkinter import messagebox
from tkinter import ttk
root = tk.Tk()
root.title('My root')
root.geometry('500x300')
def demo():
pass
b1 = tk.Button(root, text='文本', font=('Arial', 12), width=10, height=1, command=demo)
b1.pack()
root.mainloop()
主窗口參數
語法 |
作用 |
root = tk.TK() |
創建窗口 |
root['height'] = 300 |
設置高 |
root['width'] = 500 |
設置寬 |
root.title('魔方小站') |
設置標題 |
root['bg'] = '#0099ff' |
設置背景色 |
root.geometry("500x300+120+100") |
設置窗口大小 |
root.option_add('*Font', 'Fira 10') |
設置全局字體 |
root.resizable(width=False,height=True) | root.resizable(0,1) |
禁止窗口調整大小 |
root.minsize(300,600) |
窗口可調整的最小值 |
root.maxsize(600,1200) |
窗口可調整的最大值 |
root.attributes("-toolwindow", 1) |
工具欄樣式 |
root.attributes("-topmost", -1) |
置頂窗口 |
root.state("zoomed") |
窗口最大化 |
root.iconify() |
窗口最小化 |
root.attributes("-alpha",1) |
窗口透明化,透明度從 0-1,1 是不透明,0 是全透明 |
root.iconbitmap('c:\logo.ico') |
設置左上角圖標 |
root.destroy() |
關閉窗口 |
root.mainloop() |
主窗口循環更新 |
窗口禁止關閉
def closeroot():
messagebox.showerror(title='警告',message='沒錯你關不掉')
return
root.protocol('WM_DELETE_root', closeroot)
正常退出
def closewindow():
quit()
root.protocol("WM_DELETE_WINDOW", closewindow)
Label 標簽
語法 |
作用 |
l = tk.label(root,text = '文本',bg = '顏色',font = ('Arial',12),width = 30,height = 2) |
創建標簽 |
l.pack() |
顯示標簽 |
語法 |
作用 |
b = tk.Button(root, text='文本', font=('Arial', 12), width=10, height=1, command=函數名) |
創建按鈕。 |
b.pack() |
顯示按鈕。 |
Entry 輸入框
語法 |
作用 |
e1 = tk.Entry(root, show='*', font=('Arial', 14) |
創建輸入框,密文顯示。 |
e1.pack() |
放置輸入框 |
e2 = tk.Entry(root, show=None, font=('Arial', 14)) |
創建輸入框,明文顯示。 |
e2.pack() |
放置輸入框 |
e.get() |
輸出輸入框中的內容,可以作為變量。 |
Text 文本框
語法 |
作用 |
text = tk.Text(root,height = 3) |
創建文本框 |
text.pack() |
放置文本框 |
text.insert('insert',文本) |
在文本框鼠標標點處插入。 |
text.insert('end',文本) |
在文本框末尾處插入。 |
text.mark_set('mark',1.0) |
1.0 或 1.1 設置標記插入位置 |
text.insert('mark',文本) |
在標記處插入 |
text.mark_gravity('mark',LEFT) |
標記在右側插入 |
按鈕改變文本
foo = StringVar()
foo.set("開")
def demo():
foo.set("關")
按鈕 = tk.Button(root,textvariable=foo,command=開始1)
按鈕.grid(row=5, column=0, padx=10, pady=5)
Listbox 窗口部件
列表框
語法 |
作用 |
self.lb.curselection() |
提取點中選項的下標 |
self.lb.get(self.lb.curselection()) |
提前點中選項下標的值 |
單選框
復選框
Scale 窗口部件
刻度條
Canvas 窗口部件
畫布
語法 |
作用 |
菜單欄 = tk.Menu(root) |
創建一個菜單欄 |
菜單項 = tk.Menu(菜單欄, tearoff=0) |
創建一個菜單項,默認不下拉。 |
菜單欄.add_cascade(label='菜單名', menu=菜單項) |
空菜單命名 |
菜單項.add_command(label='子菜單名', command=函數名) |
在菜單項中加入子菜單 |
菜單項.add_separator() |
在菜單項中加入一條分割線 |
菜單項2 = tk.Menu(菜單欄, tearoff=0) |
創建第二個菜單項,默認不下拉 |
菜單欄.add_cascade(label='菜單名', menu=菜單項2) |
空菜單命名 |
菜單項2.add_command(label='子菜單名', command=函數名) |
在菜單項中加入子菜單 |
二級菜單 = tk.Menu(菜單項) |
創建二級菜單,即菜單項里面的菜單。 |
菜單項.add_cascade(label='菜單名', menu=二級菜單, underline=0) |
在菜單項下面創建一個菜單項 |
二級菜單.add_command(label='菜單名', command=函數名) |
創建第三級菜單命令 |
root.config(menu=菜單欄) |
放置菜單欄 |
Combobox 下拉選擇
語法 |
作用 |
cv = tk.stringVar() |
綁定變量 |
com = ttk.Combobox(root, textvariable=cv) |
創建下拉框 |
com.pack() |
放置下拉框 |
com["value"] = ('文本',文本') |
設置下拉數據 |
com.current(索引) |
設置默認值 |
demo = com.get() |
變量接受值 |
com.bind("<
>", 函數名)
|
下拉數據點擊調用函數 |
Frame 窗口部件
messageBox 彈窗
語法 |
作用 |
tk.messagebox.showwarning(title='窗口名', message='警告信息') |
警告信息彈窗 |
tk.messagebox.showinfo('窗口名','提示信息') |
提示信息彈窗 |
tk.messagebox.showerror('窗口名','錯誤信息') |
錯誤信息彈窗 |
語法 |
返回值 |
作用 |
tk.messagebox.askokcancel('提示','要執行此操作嗎') |
True | False |
(疑問)確定取消對話框 |
tk.messagebox.askquestion('提示', '要執行此操作嗎') |
yes | no |
(疑問)是否對話框 |
tk.messagebox.askyesno('提示', '要執行此操作嗎') |
True | False |
(疑問)是否對話框 |
tk.messagebox.askretrycancel('提示', '要執行此操作嗎') |
True | False |
(警告)重試取消對話框 |
語法 |
返回值 |
作用 |
tk.filedialog.asksaveasfilename() |
含后綴文件目錄 |
另存為窗口彈窗。 |
tk.filedialog.asksaveasfile() |
文件流對象 |
另存為窗口彈窗,會創建文件。 |
tkinter.filedialog.askopenfilename() |
含后綴文件目錄 |
打開文件彈窗。 |
tk.filedialog.askopenfile() |
文件流對象 |
打開文件彈窗, |
tk.filedialog.askdirectory() |
目錄名 |
選擇文件彈窗 |
tk.filedialog.askopenfilenames() |
元組 |
打開多個文件名 |
tk.filedialog.askopenfiles()# |
列表 |
多個文件流對象 |
部件放置方式
放置方式 |
參數 |
作用 |
grid |
row = 0 |
行 |
|
colum = 0 |
列 |
|
padx = 0 |
單元格左右間距 |
|
pady = 0 |
單元格上下間距 |
|
ipadx = 0 |
單元格內部元素與單元格的左右間距 |
|
ipady = 0 |
單元格內部元素與單元格的上下間距 |
.grid(row = 0,column = 0,padx = 0,pady = 0,ipadx = 0,ipady = 0)
放置方式 |
參數 |
作用 |
pack |
side = 'top' |
上 |
|
side = 'bottom' |
下 |
|
side = 'left' |
左 |
|
side = 'right' |
右 |
.pack(side='top')
放置方式 |
參數 |
作用 |
place |
x = 0 |
坐標 x |
|
y = 0 |
坐標 y |
|
anchor = 'nw' |
錨定點 |
.place(x = 0,y = 0, anchor = 'nw')
滾動條
滾動條位置
self.slb.place(x=250, y=170,relwidth=0.05, relheight=0.3)
事件綁定
事件序列
- type 部分的內容是最重要的,它通常用於描述普通的事件類型,例如鼠標點擊或鍵盤按鍵點擊。
- modifier 部分的內容是可選的,它通常用於描述組合鍵,例如 Ctrl + c,Shift + 鼠標左鍵點擊。
- detail 部分的內容是可選的,它通常用於描述具體的按鍵,例如 Button-1 表示鼠標左鍵。
事件序列 |
含義 |
序列 |
<Button-1> |
用戶點擊鼠標左鍵 |
detail |
<KeyPress-H> |
用戶點擊 H 按鍵 |
|
<Control-Shift-KeyPress-H> |
用戶同時點擊 Ctrl + Shift + H |
|
type
type |
含義 |
Activate |
當組件的狀態從“未激活”變為“激活”的時候觸發該事件 |
Button |
1. 當用戶點擊鼠標按鍵的時候觸發該事件 2. detail 部分指定具體哪個按鍵:
鼠標左鍵,
鼠標中鍵,
鼠標右鍵,
滾輪上滾(Linux),
滾輪下滾(Linux)
|
ButtonRelease |
1. 當用戶釋放鼠標按鍵的時候觸發該事 2. 在大多數情況下,比 Button 要更好用,因為如果當用戶不小心按下鼠標,用戶可以將鼠標移出組件再釋放鼠標,從而避免不小心觸發事件 |
Configure |
當組件的尺寸發生改變的時候觸發該事件 |
Deactivate |
當組件的狀態從“激活”變為“未激活”的時候觸發該事件 |
Destroy |
當組件被銷毀的時候觸發該事件 |
Enter |
1. 當鼠標指針進入組件的時候觸發該事件 2. 注意:不是指用戶按下回車鍵 |
Expose |
當窗口或組件的某部分不再被覆蓋的時候觸發該事件 |
FocusIn |
1. 當組件獲得焦點的時候觸發該事件 2. 用戶可以用 Tab 鍵將焦點轉移到該組件上(需要該組件的 takefocus 選項為 True) 3. 你也可以調用 focus_set() 方法使該組件獲得焦點(見上方例子) |
FocusOut |
當組件失去焦點的時候觸發該事件 |
KeyPress |
1. 當用戶按下鍵盤按鍵的時候觸發該事件 2. detail 可以指定具體的按鍵,例如
表示當大寫字母 H 被按下的時候觸發該事件 3. KeyPress 可以簡寫為 Key
|
KeyRelease |
當用戶釋放鍵盤按鍵的時候觸發該事件 |
Leave |
當鼠標指針離開組件的時候觸發該事件 |
Map |
1. 當組件被映射的時候觸發該事件 2. 意思是在應用程序中顯示該組件的時候,例如調用 grid() 方法 |
Motion |
當鼠標在組件內移動的整個過程均觸發該事件 |
MouseWheel |
1. 當鼠標滾輪滾動的時候觸發該事件 2. 目前該事件僅支持 Windows 和 Mac 系統,Linux 系統請參考 Button |
Unmap |
1. 當組件被取消映射的時候觸發該事件 2. 意思是在應用程序中不再顯示該組件的時候,例如調用 grid_remove() 方法 |
Visibility |
當應用程序至少有一部分在屏幕中是可見的時候觸發該事件 |
modifier
在事件序列中,modifier 部分的內容可以是以下這些:
modifier |
含義 |
Alt |
當按下 Alt 按鍵的時候 |
Any |
1. 表示任何類型的按鍵被按下的時候 2. 例如
表示當用戶按下任何按鍵時觸發事件
|
Control |
當按下 Ctrl 按鍵的時候 |
Double |
1. 當后續兩個事件被連續觸發的時候 2. 例如
表示當用戶雙擊鼠標左鍵時觸發事件
|
Lock |
當打開大寫字母鎖定鍵(CapsLock)的時候 |
Shift |
當按下 Shift 按鍵的時候 |
Triple |
跟 Double 類似,當后續三個事件被連續觸發的時候 |
Event 對象
當 Tkinter 去回調你定義的函數的時候,都會帶着 Event 對象(作為參數)去調用,Event 對象以下這些屬性你可以使用:
屬性 |
含義 |
widget |
產生該事件的組件 |
x, y |
當前的鼠標位置坐標(相對於窗口左上角,像素為單位) |
x_root, y_root |
當前的鼠標位置坐標(相對於屏幕左上角,像素為單位) |
char |
按鍵對應的字符(鍵盤事件專屬) |
keysym |
按鍵名,見下方 Key names(鍵盤事件專屬) |
keycode |
按鍵碼,見下方 Key names(鍵盤事件專屬) |
num |
按鈕數字(鼠標事件專屬) |
width, height |
組件的新尺寸(Configure 事件專屬) |
type |
該事件類型 |
Key names
當事件為
,
,
的時候,detail 可以通過設定具體的按鍵名(keysym)來篩選。例如
表示按下鍵盤上的大寫字母 H 時候觸發事件,
表示按下鍵盤上的 Tab 按鍵的時候觸發事件。
(下邊按鍵碼是對應美國標准 101 鍵盤的“Latin-1”字符集,鍵盤標准不同對應的按鍵碼不同,但按鍵名是一樣的)
按鍵名(keysym) |
按鍵碼(keycode) |
代表的按鍵 |
Alt_L |
64 |
左邊的 Alt 按鍵 |
Alt_R |
113 |
右邊的 Alt 按鍵 |
BackSpace |
22 |
Backspace(退格)按鍵 |
Cancel |
110 |
break 按鍵 |
Caps_Lock |
66 |
CapsLock(大寫字母鎖定)按鍵 |
Control_L |
37 |
左邊的 Ctrl 按鍵 |
Control_R |
109 |
右邊的 Ctrl 按鍵 |
Delete |
107 |
Delete 按鍵 |
Down |
104 |
↓ 按鍵 |
End |
103 |
End 按鍵 |
Escape |
9 |
Esc 按鍵 |
Execute |
111 |
SysReq 按鍵 |
F1 |
67 |
F1 按鍵 |
F2 |
68 |
F2 按鍵 |
F3 |
69 |
F3 按鍵 |
F4 |
70 |
F4 按鍵 |
F5 |
71 |
F5 按鍵 |
F6 |
72 |
F6 按鍵 |
F7 |
73 |
F7 按鍵 |
F8 |
74 |
F8 按鍵 |
F9 |
75 |
F9 按鍵 |
F10 |
76 |
F10 按鍵 |
F11 |
77 |
F11 按鍵 |
F12 |
96 |
F12 按鍵 |
Home |
97 |
Home 按鍵 |
Insert |
106 |
Insert 按鍵 |
Left |
100 |
← 按鍵 |
Linefeed |
54 |
Linefeed(Ctrl + J) |
KP_0 |
90 |
小鍵盤數字 0 |
KP_1 |
87 |
小鍵盤數字 1 |
KP_2 |
88 |
小鍵盤數字 2 |
KP_3 |
89 |
小鍵盤數字 3 |
KP_4 |
83 |
小鍵盤數字 4 |
KP_5 |
84 |
小鍵盤數字 5 |
KP_6 |
85 |
小鍵盤數字 6 |
KP_7 |
79 |
小鍵盤數字 7 |
KP_8 |
80 |
小鍵盤數字 8 |
KP_9 |
81 |
小鍵盤數字 9 |
KP_Add |
86 |
小鍵盤的 + 按鍵 |
KP_Begin |
84 |
小鍵盤的中間按鍵(5) |
KP_Decimal |
91 |
小鍵盤的點按鍵(.) |
KP_Delete |
91 |
小鍵盤的刪除鍵 |
KP_Divide |
112 |
小鍵盤的 / 按鍵 |
KP_Down |
88 |
小鍵盤的 ↓ 按鍵 |
KP_End |
87 |
小鍵盤的 End 按鍵 |
KP_Enter |
108 |
小鍵盤的 Enter 按鍵 |
KP_Home |
79 |
小鍵盤的 Home 按鍵 |
KP_Insert |
90 |
小鍵盤的 Insert 按鍵 |
KP_Left |
83 |
小鍵盤的 ← 按鍵 |
KP_Multiply |
63 |
小鍵盤的 * 按鍵 |
KP_Next |
89 |
小鍵盤的 PageDown 按鍵 |
KP_Prior |
81 |
小鍵盤的 PageUp 按鍵 |
KP_Right |
85 |
小鍵盤的 → 按鍵 |
KP_Subtract |
82 |
小鍵盤的 - 按鍵 |
KP_Up |
80 |
小鍵盤的 ↑ 按鍵 |
Next |
105 |
PageDown 按鍵 |
Num_Lock |
77 |
NumLock(數字鎖定)按鍵 |
Pause |
110 |
Pause(暫停)按鍵 |
Print |
111 |
PrintScrn(打印屏幕)按鍵 |
Prior |
99 |
PageUp 按鍵 |
Return |
36 |
Enter(回車)按鍵 |
Right |
102 |
→ 按鍵 |
Scroll_Lock |
78 |
ScrollLock 按鍵 |
Shift_L |
50 |
左邊的 Shift 按鍵 |
Shift_R |
62 |
右邊的 Shift 按鍵 |
Tab |
23 |
Tab(制表)按鍵 |
Up |
98 |
↑ 按鍵 |
捕獲鼠標點擊坐標
import tkinter as tk
root = tk.Tk()
def callback(event):
print("點擊坐標:", event.x, event.y)
frame = tk.Frame(root, width = 200, height = 200)
frame.bind("<Button-1>", callback)
frame.pack()
root.mainloop()
獲取鍵盤事件
import tkinter as tk
root = tk.Tk()
def callback(event):
print("點擊的鍵盤字符為:", event.char)
frame = tk.Frame(root, width = 200, height = 200)
frame.bind("<Key>", callback)
frame.focus_set()
frame.pack()
root.mainloop()
捕獲鼠標在組件上的運動軌跡
# 捕獲鼠標在組件上的運動軌跡
import tkinter as tk
root = tk.Tk()
def callback(event):
print("當前坐標為:", event.x, event.y)
frame = tk.Frame(root, width=200, height=200)
frame.bind("<Motion>", callback)
frame.pack()
root.mainloop()
注意
1、控件和放置最好兩行代碼,不然有可能返回 None
2、控件事件函數需要兩個參數
3、導入模塊順序 tkinter 要在 PIL 前