Frame
from tkinter import *
root = Tk()
# 定义第一个容器
frame_left=Frame(root,bg="green")
frame_left.place(relx=0.2,rely=0.2,relwidth=0.3,relheight=0.6)
label_1=Label(frame_left,text="富强")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_left,text="民主")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_left,text="文明")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_left,text="和谐")
label_4.place(relx=0.6,rely=0.6)
# 定义第二个容器
frame_right=Frame(root,bg="yellow")
frame_right.place(relx=0.5,rely=0.2,relwidth=0.3,relheight=0.6)
label_1=Label(frame_right,text="自由")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_right,text="平等")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_right,text="公正")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_right,text="法治")
label_4.place(relx=0.6,rely=0.6)
root.mainloop()
LabelFrame
from tkinter import *
root=Tk()
# 定义第一个容器
frame_left=LabelFrame(root,text="国家层面",labelanchor="n")
frame_left.place(relx=0.2,rely=0.2,relwidth=0.3,relheight=0.6)
label_1=Label(frame_left,text="富强")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_left,text="民主")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_left,text="文明")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_left,text="和谐")
label_4.place(relx=0.6,rely=0.6)
# 定义第二个容器
frame_right=LabelFrame(root,text="社会层面",labelanchor="n")
frame_right.place(relx=0.5,rely=0.2,relwidth=0.3,relheight=0.6)
label_1=Label(frame_right,text="自由")
label_1.place(relx=0.2,rely=0.2)
label_2=Label(frame_right,text="平等")
label_2.place(relx=0.6,rely=0.2)
label_3=Label(frame_right,text="公正")
label_3.place(relx=0.2,rely=0.6)
label_4=Label(frame_right,text="法治")
label_4.place(relx=0.6,rely=0.6)
root.mainloop()
Grid网格布局,将控件放置到一个二维的表格里。
主控件被分割成一系列的行和列,表格中每个单元可以放置一个控件
from tkinter import *
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
#创建一个输入组件
e = Entry(relief=SUNKEN, font=('Courier New', 24), width=25)
#对该输入组件使用Pack布局,放在容器顶部
e.pack(side=TOP, pady=10)
p = Frame(self.master)
p.pack(side=TOP)
#定义字符串的元组
names = ("0" , "1" , "2" , "3", "4" , "5" , "6" , "7" , "8" , "9"
, "+" , "-" , "*" , "/" , ".", "=")
#遍历字符串元组
for i in range(len(names)):
#创建Button,将Button放入p组件中
b = Button(p, text=names[i], font=('Verdana', 20), width=6)
b.grid(row=i // 4, column=i % 4)
root = Tk()
root.title("Grid布局")
App(root)
root.mainloop()
Pack:相对布局
当程序向容器中添加组件时,这些组件会依次向后排列,排列方向既是水平/垂直
from tkinter import *
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
fm1 = Frame(self.master)#创建第一个容器
fm1.pack(side=LEFT, fill=BOTH, expand=YES)#该容器放在左边排列
#向fm1中添加3个按钮,设置按钮从顶部开始排列,且按钮只能在垂直方向填充
Button(fm1, text='一').pack(side=TOP, fill=X, expand=YES)
Button(fm1, text='二').pack(side=TOP, fill=X, expand=YES)
Button(fm1, text='三').pack(side=TOP, fill=X, expand=YES)
fm2 = Frame(self.master)#创建第二个容器
fm2.pack(side=LEFT, padx=10, expand=YES)#该容器放在左边排列,会挨着fm1
#向fm2中添加3个按钮,设置按钮从右边开始排列
Button(fm2, text='1').pack(side=RIGHT, fill=Y, expand=YES)
Button(fm2, text='2').pack(side=RIGHT, fill=Y, expand=YES)
Button(fm2, text='3').pack(side=RIGHT, fill=Y, expand=YES)
fm3 = Frame(self.master)#创建第三个容器
fm3.pack(side=RIGHT, padx=10, fill=BOTH, expand=YES)
#向fm3中添加3个按钮,设置按钮从底部开始排列,且按钮只能在垂直方向填充
Button(fm3, text='Ⅰ').pack(side=BOTTOM, fill=X, expand=YES)
Button(fm3, text='Ⅱ').pack(side=BOTTOM, fill=X, expand=YES)
Button(fm3, text='Ⅲ').pack(side=BOTTOM, fill=X, expand=YES)
root = Tk()
root.title("Pack布局")
display = App(root)
root.mainloop()
Place:绝对布局,需要设置组件的x、y或relx、rely选项
Tkinter 容器内的坐标系统的原点 (0, 0) 在左上角,其中 X 轴向右延伸,Y 轴向下延伸
from tkinter import *
import random
class App:
def __init__(self, master):
self.master = master
self.initWidgets()
def initWidgets(self):
#定义字符串元组
books = ('语文', '数学', '英语', '物理', '化学')
for i in range(len(books)):
#生成3个随机数
ct = [random.randrange(256) for x in range(3)]
grayness = int(round(0.299*ct[0] + 0.587*ct[1] + 0.114*ct[2]))
#将元组中3个随机数格式化成16进制数,转成颜色格式
bg_color = "#%02x%02x%02x" % tuple(ct)
#创建Label,设置背景色和前景色
lb = Label(root,
text=books[i],
fg = 'White' if grayness < 120 else 'Black',
bg = bg_color)
#使用place()设置该Label的大小和位置
lb.place(x = 20, y = 36 + i*36, width=180, height=30)
root = Tk()
root.title("Place布局")
root.geometry("250x250+30+30")#width x height + x_offset + y_offset
App(root)
root.mainloop()
使用 x, y, height, width 直接指定位置和宽高
使用 relx, rely, relheight, relwidth 指定相对比例的宽高
Menu 下拉菜单和级联菜单/弹出菜单
from tkinter import *
root = Tk()
#下拉菜单和级联菜单
def callback():
print("你好")
menubar = Menu(root)
filemenu = Menu(menubar, tearoff=False)
filemenu.add_command(label='打开', command=callback)
filemenu.add_command(label='保存', command=callback)
filemenu.add_separator()#添加分割线
filemenu.add_command(label='退出', command=root.quit)
menubar.add_cascade(label='文件', menu=filemenu)#创建级联菜单,menu选项指定下一级的菜单是什么
editmenu = Menu(menubar, tearoff=False)
editmenu.add_command(label='剪切', command=callback)
editmenu.add_command(label='拷贝', command=callback)
editmenu.add_separator()#添加分割线
editmenu.add_command(label='粘贴', command=callback)
menubar.add_cascade(label='编辑', menu=editmenu)
#弹出菜单
popmenubar = Menu(root)
popmenubar.add_command(label='撤销', command=callback)
popmenubar.add_command(label='重做', command=callback)
frame = Frame(root, width=512, height=512)
frame.pack()
def popup(event):
popmenubar.post(event.x_root, event.y_root)
frame.bind("<Button-3>", popup)
root.config(menu=menubar)
OptionMenu
from tkinter import *
root = Tk()
OPTIONS = ['1','asf','hdfs','safsdv']
variable = StringVar()
variable.set(OPTIONS[0])
w = OptionMenu(root, variable, *OPTIONS) #不加*整个列表会被作为一个选项
w.pack()
mainloop()
组件的显示、隐藏 place place_forget
from tkinter import *
root = Tk()
def hide():
theLB.place_forget()
def show():
theLB.place(relx=0.1,rely=0,relwidth=0.3,relheight=0.4)
# 创建一个空列表
theLB = Listbox(root)
# 往列表里添加数据
for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋"]:
theLB.insert("end", item)
b1 = Button(root, text='隐藏', command=hide)
b2 = Button(root, text='显示', command=show)
b1.place(relx=0.2,rely=0.6,relwidth=0.2,relheight=0.2)
b2.place(relx=0.5,rely=0.6,relwidth=0.2,relheight=0.2)
root.mainloop()
事件
bind
import tkinter
win = tkinter.Tk()
def func_1(event):
print("鼠标左键")
def func_2(event):
print("鼠标滚轮")
def func_3(event):
print("鼠标右键")
def func_4(event):
print("鼠标双击左键")
def func_5(event):
print("鼠标中键双击")
def func_6(event):
print("鼠标右键双击")
def func_7(event):
print("鼠标三击左键")
def func_8(event):
print("左键移动")
button1 = tkinter.Button(win, text="测试")
#bind给控件绑定数据(参数一是绑定的事件,参数二是触发事件的函数)
###鼠标点击事件
#<Button-1>鼠标左键
#<Button-2>鼠标滚轮点击
#<Button-3>鼠标右键
#<Double-Button-1>鼠标双击左键
#<Double-Button-2>鼠标中键双击
#<Double-Button-3>鼠标右键双击
#<Triple-Button-1>鼠标三击左键
###鼠标移动事件
#<B1-Motion>左键移动
#<B2-Motion>中键移动
#<B3-Motion>右键移动
###鼠标释放事件
#<ButtonRelease-1>释放鼠标左键
#<ButtonRelease-2>释放鼠标中键
#<ButtonRelease-3>释放鼠标右键
###进入离开事件
#<Enter>当鼠标进入控件时触发事件
#<Leave>当鼠标离开控件时触发事件
button1.bind("<Button-1>", func_1)
button1.bind("<Button-2>", func_2)
button1.bind("<Button-3>", func_3)
button1.bind("<Double-Button-1>", func_4)
button1.bind("<Double-Button-2>", func_5)
button1.bind("<Double-Button-3>", func_6)
button1.bind("<Triple-Button-1>", func_7)
button1.bind("<B1-Motion>", func_8)
button1.pack()
win.mainloop()
command
简单的事件处理可通过选项来绑定,当用户单击指定按钮时,通过绑定的函数会被触发
comboxlist.bind("<<ComboboxSelected>>",go)#绑定事件,下拉列表框被选中时绑定go函数
listbox1.bind("<<ListboxSelect>>",show_msg)
from tkinter import *
def show_msg(*args):
if len(self.listbox.curselection()) == 0:
return
indexs = list(listbox1.curselection())#返回一个元组,包含被选中选项序号(从0开始)
index = indexs[0]
listbox2.see(index)#调整列表框的位置,使index参数指定的选项是可见的
listbox2.select_set(index)#设置参数指定选项为选中状态
root = Tk()
root.title("listbox练习")
#创建列表显示内容
names = ("梅长苏","誉王","飞流","夏冬","霓凰郡主","蒙挚","萧景睿","谢玉")
players = ("胡歌","黄维德","吴磊","张龄心","刘涛","陈龙","程皓枫","刘奕君")
list1 = StringVar(value=names)
list2 = StringVar(value=players)
#创建两个Listbox,分别设置为单选、多选类型
listbox1 = Listbox(root,height=len(names),listvariable=list1,selectmode="browse")
listbox2 = Listbox(root,height=len(players),listvariable=list2,selectmode="extended")
listbox1.grid(row=1,column=1,padx=(10,5),pady=10)
listbox2.grid(row=1,column=2,padx=(5,10),pady=10)
listbox1.select_set(4)
#设置第二个表格的字体色/背景色
for i in range(len(players)):
listbox2.itemconfig(i,fg="blue")
if not i%2:
listbox2.itemconfig(i,bg="#f0f0ff")
#<<ListboxSelect>>绑定选择listbox项
#为第一个Listbox设置绑定事件
listbox1.bind("<<ListboxSelect>>",show_msg)
root.mainloop()