import tkinter
tkinter._test()
import tkinter
base = tkinter.Tk()
base.mainloop()
Tkinter常用组件
-
按钮
Button 按钮组件 RadioButton 单选框组件 CheckButton 选择按钮组件 Listbox 列表框组件
-
文本输入组件
Entry 单行文本框组件 Text 多行文本框组件
-
标签组件
Label 标签组件,可以显示图片和文字 Message 标签组件,可以根据内容将文字换行
-
菜单
Menu 菜单组件 MenuButton 菜单按钮组件,可以使用Menu代替
-
滚动条
scale 滑块组件 Scrollbar 滚动条组件
-
其他组件
Canvas 画布组件 Frame 框架组件,将多个组件编组 Toplevel 创建子窗口容器组件
组件的大致使用步骤
-
创建总面板
-
创建面板上的各种组件
- 指定组件的父组件,即依附关系
- 利用相应的属性对组件进行设置
- 给组件安排布局
-
同步骤2相似,创建好多个组件
-
最后,启动总面板的消息循环
import tkinter
# 创建总面板
base = tkinter.Tk()
# 标题
base.wm_title('标题')
lb = tkinter.Label(base, text='Python label')
lb.pack()
# 消息循环
base.mainloop()
# Label
import tkinter
base = tkinter.Tk()
base.wm_title('标题')
lb1 = tkinter.Label(base, text='lb1文字内容').pack()
lb2 = tkinter.Label(base, text='红色背景', background='red').pack()
lb3 = tkinter.Label(base, text='蓝色背景', background='blue').pack()
base.mainloop()
# Button
import tkinter
def showlb1():
global base
lb1 = tkinter.Label(base, text='用函数调用').pack()
base = tkinter.Tk()
# 生成一个按钮
# command参数指示,当按钮被按下时,执行哪个函数
btn = tkinter.Button(base, text='showlb1', command=showlb1).pack()
base.mainloop()
-
Button的属性:
anchor 设置按钮中文字的对其方式,相对于按钮的中心位置 background(bg) 设置按钮的背景颜色 foreground(fg) 设置按钮的前景色(文字的颜色) borderwidth(bd) 设置按钮边框宽度 cursor 设置鼠标在按钮上的样式 command 设定按钮点击时触发的函数 bitmap 设置按钮上显示的位图 font 设置按钮上文本的字体 width 设置按钮的宽度 (字符个数) height 设置按钮的高度 (字符个数) state 设置按钮的状态 text 设置按钮上的文字 image 设置按钮上的图片
-
鼠标样式
- “arrow”“circle”“clock”“cross”“dotbox”“exchange”“fleur”“heart”“heart”“man”“mouse”
- “pirate”“plus”“shuttle”“sizing”“spider”“spraycan”“star”“target”“tcross”“trek”“watch”
# Button
import tkinter
def showlb1():
global base
lb1 = tkinter.Label(base, text='用函数调用').pack()
base = tkinter.Tk()
# 生成一个按钮
# command参数指示,当按钮被按下时,执行哪个函数
btn = tkinter.Button(base, text='showlb1', command=showlb1, bg='black', fg='white', bd=10, cursor='circle').pack()
base.mainloop()
组件布局
-
控制组件的摆放方式
-
三种布局:
- pack: 按照方位布局
- place:按照坐标布局
- grid: 网格布局
-
pack布局
- 最简单,代码量最少,挨个摆放,默认从上到下
- 通用使用方式:组件对象.pack(设置属性)
- side 停靠方位,可选值:left,top,right,bottom
- fill 填充方式: x,y,both,none
- expand:yes/no
- anchor:n, ne, e, se, s, sw, w, nw, or center
- ipadx:x方向内边距
- ipady:y方向内边距
- padx:x方向外边界
- pady:y方向外边界
-
grid布局
- 通用使用方式:组件对象.grid(设置,)
- 利用row,column编号,都是从0开始
- sticky: N,E,S,W表示上下左右,用来决定组件从哪个方向开始
- 支持ipadx,padx等参数,跟pack函数含义一样
- 支持rowspan,columnspan,表示跨行,跨列数量
-
place布局
- 明确方位的摆放
- 相对位置布局,随意改变窗口大小会导致混乱
- 使用place函数,分为绝对布局和相对布局,绝对布局使用x,y参数
- 相对布局使用relx,rely, relheight, relwidth
# pack布局
import tkinter
base = tkinter.Tk()
btn1 = tkinter.Button(base, text=1, bg='yellow')
btn1.pack(side='left', expand='yes',fill='both', anchor='nw')
btn2 = tkinter.Button(base,text=2)
btn2.pack(side='bottom', expand='no',fill='y', anchor='sw' )
btn3 = tkinter.Button(base,text=3)
btn3.pack(side='top', expand='yes',fill='both', anchor='n')
btn4 = tkinter.Button(base,text=4)
btn4.pack(side='right', expand='yes',fill='both',)
btn5 = tkinter.Button(base,text=5)
btn5.pack(side='left', expand='yes',fill='both',)
btn6 = tkinter.Button(base,text=6)
btn6.pack(side='left', expand='yes',fill='both',)
base.mainloop()
# grid布局
import tkinter
base = tkinter.Tk()
lb1 = tkinter.Label(base, text='账号:')
lb1.grid(row=0, sticky='w')
en = tkinter.Entry(base)
en.grid(row=0, column=1, sticky='e')
lb2 = tkinter.Label(base, text='密码:')
lb2.grid(row=1, sticky='w')
en = tkinter.Entry(base)
en.grid(row=1, column=1, sticky='e')
btn = tkinter.Button(base, text='登录').grid(row=2,column=1,sticky='e')
base.mainloop()
消息机制
- 消息的传递机制
- 自动发出事件/消息
- 消息有系统负责发送到队列
- 由相关组件进行绑定/设置
- 后端自动选择感兴趣的事件并做出相应反应
# 消息机制
import tkinter
def baselabel(event):
global base
lb = tkinter.Label(base, text='i love python')
lb.pack()
base = tkinter.Tk()
lb = tkinter.Label(base, text='模拟按钮')
# label绑定相应的消息和处理函数
# 自动获取左键点击,并启动相应的处理函数baseLabel
lb.bind('<Button-1>', baselabel)
lb.pack()
base.mainloop()
Tkinter的绑定
- bind_all: 全局范围的绑定,默认的是全局快捷键,比如F1是帮助文档
- bind_class: 接受三个参数,第一个是类名,第二个是事件,第三个是操作
- w.bind_class(“Entry”, ", my_paste)
- bind:单独对某一个实例绑定
- unbind: 解绑,需要一个参数,即你要解绑哪个事件
Entry
- 输入框,功能单一
- entry[“show”] = “*”, 设置遮挡字符
import tkinter
# 登录模拟
def reg():
# 从输入框中获取用户输入消息
name = en1.get()
pwd = en2.get()
t1 = len(name)
t2 = len(pwd)
if name == 'admin' and pwd == 'password':
lb3['text'] = '登录成功'
else:
lb3['text'] = '用户名或密码错误'
# 输入框删除掉用户输入的内容
# 注意delete的两个参数,表示从第几个删除到第几个
en1.delete(0,t1)
en2.delete(0,t2)
base = tkinter.Tk()
lb1 = tkinter.Label(base, text='账号:')
lb1.grid(row=0, sticky='w')
en1 = tkinter.Entry(base)
en1.grid(row=0, column=1, sticky='e')
lb2 = tkinter.Label(base, text='密码:')
lb2.grid(row=1, sticky='w')
en2 = tkinter.Entry(base)
en2.grid(row=1, column=1, sticky='e')
en2['show'] = '*'
btn = tkinter.Button(base, text='登录', command=reg)
btn.grid(row=2, column=1,sticky='e')
lb3 = tkinter.Label(base, text='')
lb3.grid(row = 3)
base.mainloop()
菜单
1. 普通菜单
- 第一个Menu类定义的是parent
- add_command 添加菜单项,如果菜单是顶层菜单,则从左向右添加,否则就是下拉菜单
- label: 指定菜单项名称
- command: 点击后相应的调用函数
- acceletor: 快捷键
- underline: 制定是否菜单信息下有横线
- menu:属性制定使用哪一个作为顶级菜单
import tkinter
base = tkinter.Tk()
menubar = tkinter.Menu(base)
for item in ['File', 'Edit', 'View', 'About']:
menubar.add_command(label=item)
base['menu'] = menubar
base.mainloop()
级联菜单
- add_cascade:级联菜单,作用是引出后面的菜单
- add_cascade的menu属性:指明把菜单级联到哪个菜单上
- label: 名称
- 过程:
- 建立menu实例
- add_command
- add_cascade
import tkinter
base = tkinter.Tk()
menubar = tkinter.Menu(base)
emenu = tkinter.Menu(menubar)
for item in ['Copy', 'Past', 'Cut']:
emenu.add_separator()
emenu.add_command(label=item)
menubar.add_cascade(label='File')
menubar.add_cascade(label='Edit', menu=emenu)
menubar.add_cascade(label='About')
base['menu'] = menubar
base.mainloop()
弹出式菜单
- 弹出菜单也叫上下文菜单
- 实现的大致思路
- 简理财单并向菜单添加各种功能
- 监听鼠标右键
- 如果右键点击,则根据位置判断弹出
- 调用Menu的pop方法
- add_separator: 添加分隔符
import tkinter
def makeLabel():
global base
lb1 = tkinter.Label(base, text='I Love Python').pack()
base = tkinter.Tk()
menubar = tkinter.Menu(base)
for x in ['香菇鸡块', '蒜苔腊肉', '东坡肘子']:
menubar.add_separator()
menubar.add_command(label=x)
menubar.add_command(label='麻辣香锅', command=makeLabel)
# 事件处理函数一定要至少有一个参数,且第一个参数表示的是系统事件
def pop(event):
# 注意使用 event.x 和 event.x_root的区别
#menubar.post(event.x_root, event.y_root)
menubar.post(event.x_root, event.y_root)
base.bind('<Button-3>', pop)
base.mainloop()
canvas 画布
- 画布: 可以自由的在上面绘制图形的一个小舞台
- 在画布上绘制对象, 通常用create_xxxx,xxxx=对象类型, 例如line,rectangle
- 画布的作用是把一定组件画到画布上显示出来
- 画布所支持的组件:
- arc
- bitmap
- image(BitmapImage, PhotoImage)
- line
- oval
- polygon
- rectangle
- text
- winodw(组件)
- 每次调用create_xxx都会返回一个创建的组件的ID,同时也可以用tag属性指定其标签
- 通过调用canvas.move实现一个一次性动作
import tkinter
base = tkinter.Tk()
cvs = tkinter.Canvas(base, width=300, height=200)
cvs.pack()
cvs.create_line(23,23, 190,234)
cvs.create_text(56,67, text='I Love Python')
base.mainloop()
import tkinter
import math as m
base = tkinter.Tk()
w = tkinter.Canvas(base, width=300, height=300, bg='black')
w.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)),
]
# 创建一个多边形
w.create_polygon(points, outline='white', fill='red')
w.create_text(150,150, text="五角星")
base.mainloop()
import tkinter
base = tkinter.Tk()
def btnClick(event):
global w
w.move(id_ball, 10,5)
w.move("fall", 2,7)
w = tkinter.Canvas(base, width=500, height=400)
w.pack()
w.bind("<Button-1>", btnClick)
# 创建组件后返回id
id_ball = w.create_oval(20,20, 50,50, fill="green")
# 创建组件使用tag属性
w.create_text(123,56, fill="red", text="ILovePython", tag="fall")
# 创建的时候如果没有指定tag可以利用addtag_withtag添加
# 同类函数还有 addtag_all, addtag_above, addtag_xxx等等
id_rectangle = w.create_rectangle(56,78,173,110, fill="gray")
w.addtag_withtag("fall", id_rectangle)
base.mainloop()