参考:https://morvanzhou.github.io/tutorials/python-basic/tkinter/1-1-why/
Tkinter 是使用 python 进行窗口视窗设计的模块.
简单的构造, 多平台, 多系统的兼容性, 能让它成为让你快速入门定制窗口文件的好助手.
它在 python 窗口视窗模块中是一款简单型的. 所以用来入门, 熟悉 窗口视窗的使用, 非常有必要.
import tkinter as tk
一、Label & Button 标签和按钮
代码效果:点击按钮,标签显示不同内容
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('300x100') #定义窗口大小
var = tk.StringVar()
l = tk.Label(window, #定义一个在window上面的label
textvariable=var, # 标签的文字,是个字符串变量
bg='green', # 背景颜色
font=('Arial', 12), # 字体和字体大小
width=15, height=2 # 标签长宽
)
l.pack() # 固定窗口位置,l.space()设置点位置
on_hit = False #全局变量控制显示
def hit_me():
global on_hit
if on_hit ==False:
var.set('you hit me')
on_hit = True
else:
var.set('')
on_hit = False
b = tk.Button(window,text='hit me',width=15,
height=2,command=hit_me)
b.pack()
window.mainloop() #window不断刷新
二、Entry & Text 输入, 文本框
代码效果:entry输入的文字通过button点击显示在text中
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('300x200') #定义窗口大小
e = tk.Entry(window,show=None) #显示字符,show='*'输入的字符显示为*
e.pack()
def insert_point():
var = e.get() #获取Entry的值
t.insert('insert',var) #插到光标之前,如果是insert(1.1,var)表示插入第一行第一列
def insert_end():
var = e.get()
t.insert('end',var) #插到文本最后之前
b1 = tk.Button(window,text='insert_point',width=15,
height=2,command=insert_point)
b1.pack()
b2 = tk.Button(window,text='insert_end',width=15,
height=2,command=insert_end)
b2.pack()
t = tk.Text(window,height=2)
t.pack()
window.mainloop() #window不断刷新
三、Listbox 列表部件
代码效果:选中列表,显示在某个地方
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('300x200') #定义窗口大小
var1 = tk.StringVar()
l = tk.Label(window,bg='yellow',width=4,textvariable=var1)
l.pack()
def print_selection():
value = lb.get(lb.curselection()) #拿出选中的listbox的值
var1.set(value) #放到label中
b1 = tk.Button(window,text='print selection',width=15,
height=2,command=print_selection)
b1.pack()
var2 = tk.StringVar()
var2.set((11,22,33,44,55))
lb = tk.Listbox(window,listvariable=var2)
list_items = [1,2,3,4]
for item in list_items: #插入列表到listbox
lb.insert('end',item)
lb.insert(1,'first')
lb.insert(2,'second')
lb.delete(2) #删除
lb.pack()
window.mainloop() #window不断刷新
四、Radiobutton 选择按钮
代码效果:单选按钮改变label内容
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('300x200') #定义窗口大小
var = tk.StringVar()
l = tk.Label(window,bg='yellow',width=20,text='empty')
l.pack()
def print_selection():
l.config(text='you have selected ' + var.get()) #l的参数进行改变
r1 = tk.Radiobutton(window,text='Option A',
variable=var,value='A', #选中该按钮时把var赋值为A
command=print_selection)
r2 = tk.Radiobutton(window,text='Option B',
variable=var,value='B',
command=print_selection)
r3 = tk.Radiobutton(window,text='Option C',
variable=var,value='C',
command=print_selection)
r1.pack()
r2.pack()
r3.pack()
window.mainloop() #window不断刷新
五、Scale 尺度 类似一个数字滚动条
代码效果:拉动滚动条,选中一个数字
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('300x200') #定义窗口大小
l = tk.Label(window,bg='yellow',width=20,text='empty')
l.pack()
def print_selection(v):
l.config(text='you have selected ' + v) #l的参数进行改变
s = tk.Scale(window,label='try me', #名字
from_=5,to=11, #范围
orient=tk.HORIZONTAL, #横向
length=200, #长度
showvalue=1, #显示值
tickinterval=3, #隔单位显示
resolution=0.1, #保留的小数
command=print_selection #有个默认的传入值
)
s.pack()
window.mainloop() #window不断刷新
六、Checkbutton 勾选项:与Radiobutton类似,复选按钮
代码效果:多选效果
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('300x200') #定义窗口大小
l = tk.Label(window,bg='yellow',width=20,text='empty')
l.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') #如果两个选项都选中
var1 = tk.IntVar()
var2 = tk.IntVar()
c1 = tk.Checkbutton(window, text='Python', variable=var1, onvalue=1, offvalue=0,#选中赋值1,未选中赋值0
command=print_selection)
c2 = tk.Checkbutton(window, text='Java', variable=var2, onvalue=1, offvalue=0,
command=print_selection)
c1.pack()
c2.pack()
window.mainloop() #window不断刷新
七、Canvas画布:在一个区域放图画,并更换位置形状等,好像只能放gif图片
代码效果:点击按钮移动正方形
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('500x500') #定义窗口大小
canvas = tk.Canvas(window,bg='green',height=300,width=500)
image_file = tk.PhotoImage(file='G:\canvas.gif')
image =canvas.create_image(0,0,anchor='nw',image=image_file) #把图片放到哪个点,起点是西北
x0,y0,x1,y1=300,200,380,280 #坐标
line = canvas.create_line(x0,y0,x1,y1)
oval = canvas.create_oval(x0,y0,x1,y1,fill='red')
arc = canvas.create_arc(x0-80,y0+30,x1-80,y1+30,start=0,extent=180) #扇形打开的角度
rect = canvas.create_rectangle(100,200,180,280)
canvas.pack()
def moveit():
canvas.move(rect,0,2) #移动rect元素,x移动0,y移动2
b = tk.Button(window,text='move',command=moveit).pack()
window.mainloop() #window不断刷新
八、Menubar 菜单:窗口菜单按钮
代码效果:点击菜单数字累加
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('500x500') #定义窗口大小
l = tk.Label(window,text='',bg='yellow')
l.pack()
counter = 0
def do_job():
global counter
l.config(text='do '+ str(counter)) #把counter转为字符串
counter+=1
menubar = tk.Menu(window)
filemenu = tk.Menu(menubar, tearoff=0) #traroff表示能否分开
menubar.add_cascade(label='File', menu=filemenu) #filemenu名字为file,添加到menubar上
filemenu.add_command(label='New', command=do_job) #给filemenu绑定方法
filemenu.add_command(label='Open', command=do_job)
filemenu.add_command(label='Save', command=do_job)
filemenu.add_separator() #分隔线
filemenu.add_command(label='Exit', command=window.quit)
editmenu = tk.Menu(menubar, tearoff=0) #traroff表示能否分开
menubar.add_cascade(label='Edit', menu=editmenu) #filemenu名字为file,添加到menubar上
editmenu.add_command(label='Cut', command=do_job) #给filemenu绑定方法
editmenu.add_command(label='Cop', command=do_job)
editmenu.add_command(label='Paste', command=do_job)
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`
window.config(menu=menubar) #改变window的参数设置menu
window.mainloop() #window不断刷新
九、Frame 框架:容器, Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件
代码效果:不同frm放到不同位置
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('200x100') #定义窗口大小
tk.Label(window,text='on the window').pack()
frm = tk.Frame(window).pack()
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')
tk.Label(frm_l,text='on the frm_l1').pack()
tk.Label(frm_l,text='on the frm_l2').pack()
tk.Label(frm_r,text='on the frm_r1').pack()
window.mainloop() #window不断刷新
十、messagebox 弹窗,消息窗口,注意要单独导入import tkinter.messagebox
代码效果:点击按钮弹窗
import tkinter.messagebox
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('200x100') #定义窗口大小
def hit_me():
# print(tk.messagebox.askokcancel("askokcancel Demo", '发射导弹?')) #return true or false
# print(tk.messagebox.askquestion("askquestion Demo", "买个优盘?")) #询问信息:return 'yes' or 'no'
print(tk.messagebox.askretrycancel("askretrycancel Demo", "启动失败,重试?")) #return true or false
# print(tk.messagebox.askyesno("askyesno Demo", "我帅吗?")) #return true or false
# tk.messagebox.showerror("showerror Demo", "出错啦!") #错误
# tk.messagebox.showinfo("showinfo Demo", "新年快乐") #信息提示
# tk.messagebox.showwarning("showwarning Demo", "你在偷懒!") #警告
tk.Button(window,text='hit me',command=hit_me).pack()
window.mainloop() #window不断刷新
十一、pack grid place 放置位置
代码效果:不同形式不同效果
import tkinter as tk
window = tk.Tk() #定义窗口
window.title('my window') #定义窗口名
window.geometry('400x400') #定义窗口大小
# #pack()通过side设置上下左右
# tk.Label(window,text=1).pack()
# 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) #row为行,colum为列,padx就是单元格左右间距,pady就是单元格上下间距。
#place放置点
tk.Label(window,text=1).place(x=10,y=100,anchor='w') #anchor设置方位
window.mainloop() #window不断刷新