tkinter快速入门

窗口

1
2
3
4
5
import
init_window = tk.Tk()
init_window.title("test")
init_window.geometry("500x400")
init_window.mainloop()

标签和按钮 Label & Button

1
2
3
4
5
6
7
8
9
10
11
12
13
14
def hit_me():
global on_hit
if on_hit == False:
var.set("you hit me")
on_hit = True
else:
on_hit = False
var.set("")
label = tk.Label(init_window, text="OMG", bg="green", font=("Arial",12), width=15, height=2)
label = tk.Label(init_window, textvariable=var, bg="green", font=("Arial", 12), width=15, height=2)
label.pack()

button = tk.Button(init_window, text="hit me", width=15, height=2, command=hit_me)
button.pack()

输入和文本框 Entry & Text

1
2
3
4
5
6
7
8
9
10
11
12
13
e = tk.Entry(init_window, show='*')
e.pack()

var = tk.StringVar()
on_hit = False
button1 = tk.Button(init_window, text="insert point", width=15, height=2, command=insert_point)
button1.pack()

button2 = tk.Button(init_window, text="insert end", width=15, height=2, command=insert_end)
button2.pack()

t = tk.Text(init_window, height=2)
t.pack()

列表部件 Listbox

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var2 = tk.StringVar()
var2.set((11,22,33,44)) #为变量设置值

#创建Listbox

lb = tk.Listbox(window, listvariable=var2) #将var2的值赋给Listbox

#创建一个list并将值循环添加到Listbox控件中
list_items = [1,2,3,4]
for item in list_items:
lb.insert('end', item) #从最后一个位置开始加入值
lb.insert(1, 'first') #在第一个位置加入'first'字符
lb.insert(2, 'second') #在第二个位置加入'second'字符
lb.delete(2) #删除第二个位置的字符
lb.pack()

#显示主窗口
window.mainloop()

Radiobutton 选择按钮

1
2
3
4
5
6
7
8
9
var = tk.StringVar()
var.set(0) # 默认空,选项按钮没有被勾选
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()

r1 = tk.Radiobutton(window, text='Option A',
variable=var, value='A',
command=print_selection)
r1.pack()

Scale 尺度

1
2
3
4
5
6
7
8
9
s = tk.Scale(window, label='try me', from_=5, to=11, orient=tk.HORIZONTAL,
length=200, showvalue=0, tickinterval=2, resolution=0.01, command=print_selection)
s.pack()
## 触发
l = tk.Label(window, bg='yellow', width=20, text='empty')
l.pack()

def print_selection(v):
l.config(text='you have selected ' + v)

Checkbutton 勾选项

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
var1 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0,
command=print_selection)
c1.pack()

## 触发
def print_selection():
if (var1.get() == 1) & (var2.get() == 0): #如果选中第一个选项,未选中第二个选项
l.config(text='I love only Python ')
elif (var1.get() == 0) & (var2.get() == 1): #如果选中第二个选项,未选中第一个选项
l.config(text='I love only C++')
elif (var1.get() == 0) & (var2.get() == 0): #如果两个选项都未选中
l.config(text='I do not love either')
else:
l.config(text='I love both') #如果两个选项都选中

Canvas 画布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
canvas = tk.Canvas(window, bg='blue', height=100, width=200)
canvas.pack()

image_file = tk.PhotoImage(file='ins.gif')
image = canvas.create_image(10, 10, anchor='nw', image=image_file)

x0, y0, x1, y1= 50, 50, 80, 80
line = canvas.create_line(x0, y0, x1, y1)

oval = canvas.create_oval(x0, y0, x1, y1, fill='red') #创建一个圆,填充色为`red`红色
arc = canvas.create_arc(x0+30, y0+30, x1+30, y1+30, start=0, extent=180) #创建一个扇形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20) #创建一个矩形

def moveit():
canvas.move(rect, 0, 2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
##创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方
menubar = tk.Menu(window)

##定义一个空菜单单元
filemenu = tk.Menu(menubar, tearoff=0)

##将上面定义的空菜单命名为`File`,放在菜单栏中,就是装入那个容器中
menubar.add_cascade(label='File', menu=filemenu)

##在`File`中加入`New`的小菜单,即我们平时看到的下拉菜单,每一个小菜单对应命令操作。
##如果点击这些单元, 就会触发`do_job`的功能
filemenu.add_command(label='New', command=do_job)
filemenu.add_command(label='Open', command=do_job)##同样的在`File`中加入`Open`小菜单
filemenu.add_command(label='Save', command=do_job)##同样的在`File`中加入`Save`小菜单

filemenu.add_separator()##这里就是一条分割线

##同样的在`File`中加入`Exit`小菜单,此处对应命令为`window.quit`
filemenu.add_command(label='Exit', command=window.quit)

submenu = tk.Menu(filemenu)##和上面定义菜单一样,不过此处实在`File`上创建一个空的菜单
filemenu.add_cascade(label='Import', menu=submenu, underline=0)##给放入的菜单`submenu`命名为`Import`
submenu.add_command(label="Submenu1", command=do_job)##这里和上面也一样,在`Import`中加入一个小菜单命令`Submenu1`


counter = 0
def do_job():
global counter
l.config(text='do '+ str(counter))
counter+=1

Frame 框架

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
###定义一个`label`显示`on the window`
tk.Label(window, text='on the window').pack()

###在`window`上创建一个`frame`
frm = tk.Frame(window)
frm.pack()

###在刚刚创建的`frame`上创建两个`frame`,我们可以把它理解成一个大容器里套了一个小容器,即`frm`上有两个`frame` ,`frm_l`和`frm_r`

frm_l = tk.Frame(frm)
frm_r = tk.Frame(frm)

###这里是控制小的`frm`部件在大的`frm`的相对位置,此处`frm_l`就是在`frm`的左边,`frm_r`在`frm`的右边
frm_l.pack(side='left')
frm_r.pack(side='right')

###这里的三个label就是在我们创建的frame上定义的label部件,还是以容器理解,就是容器上贴了标签,来指明这个是什么,解释这个容器。
tk.Label(frm_l, text='on the frm_l1').pack()##这个`label`长在`frm_l`上,显示为`on the frm_l1`
tk.Label(frm_l, text='on the frm_l2').pack()##这个`label`长在`frm_l`上,显示为`on the frm_l2`
tk.Label(frm_r, text='on the frm_r1').pack()##这个`label`长在`frm_r`上,显示为`on the frm_r1`

messagebox 弹窗

1
2
3
4
5
6
7
8
9
10
11
12
import tkinter as tk
from tkinter import messagebox
tk.Button(init_window, text="hit me", command=hit_me).pack()

def hit_me():
# tk.messagebox.showinfo(title="Hi", message="hahahaha")
# messagebox.showwarning(title="Hi", message="nonono")
# tk.messagebox.showerror(title="Hi", message="no!never")
# print(messagebox.askquestion(title="hi", message="hhhaaaa"))
# print(messagebox.askyesno(title="hi", message="hhhaaaa"))
# print(messagebox.askretrycancel(title="hi", message="hhhaaaa"))
print(messagebox.askokcancel(title="hi", message="hhhaaaa"))

pack grid place 放置位置

1
2
3
4
5
6
7
8
9
10
tk.Label(window, text='1').pack(side='top')#上
tk.Label(window, text='1').pack(side='bottom')#下
tk.Label(window, text='1').pack(side='left')#左
tk.Label(window, text='1').pack(side='right')#右

for i in range(4):
for j in range(3):
tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)

tk.Label(window, text=1).place(x=20, y=10, anchor='nw')