Tkinter笔记
1.常用窗口组件及说明
组件名称 | 作用 |
Button | 简单按钮,点击以执行命令 |
Canvas | 可以绘制图表和图,创建图形编辑器,定制窗口部件 |
Checkbutton | 代表一个变量,点击再两个值之间切换 |
Entry | 文本输入域 |
Frame | 窗口容器组件。可以有边框和背景,当创建一个应用程序或对话面板时,Frame用来组织其他窗口组件 |
Label | 显示文本或图像 |
Listbox | 显示供选方案的列表。listbox能被配置来得到radiobutton或checklist的行为 |
Menu | 可实现下拉式和弹出式菜单 |
Menubutton | 实现下拉式菜单 |
Message | 显示文本 |
Radiobutton | 代表一个变量,可以使多个值中的一个 |
Scale | 通过滑块设置数字值 |
Scrollbar | 为配合使用canvas,entry,listbox,text等窗口组件的标准滚动条 |
Text | 可用不同样式和属性来显示和编辑文本,支持内嵌图像和窗口 |
Toplevel | 作为一个单独的,最顶层的窗口显示 |
messageBox | 消息框 |
注意:Tkinter中窗口部件没有分级,所有窗口部件在树中都是兄弟关系
2. 各组件使用示例
2.1 主窗口及Label标签创建和使用
import tkinter as tk
window = tk.Tk()
window.title("window") #标题
window.geometry("500x300") #大小,中间是小写字母 "x"
# 可设置多种属性
l = tk.Label(window,text="hello,this is a label",bg="green",font=("Arial",12),width=30,height=1)
l.pack() # 放置到创建时制定的窗口中
window.mainloop()
2.2 Button组件的使用
按钮能包含文本或图像,按钮仅能显示一种字体,文本可跨行,这个文本的一个字母可以有下划线。
import tkinter as tk
window = tk.Tk()
window.title("window") #标题
window.geometry("500x300") #大小,中间是小写字母 "x"
# 设定标签,用以和按钮联动
var = tk.StringVar()
l = tk.Label(window,textvariable=var,bg="green",font=("Arial",12),width=30,height=1)
l.pack()
on_click = False
def click_btn():
# python函数中若想对函数外的变量进行操作,需要在函数内部对变量进行global声明
global on_click
if on_click == False:
on_click = True
var.set("clicked!")
else:
on_click = False
var.set("")
# 创建按钮
btn = tk.Button(window,text="click me",font=("Arial",12),width=10,height=1,command=click_btn)
btn.pack()
window.mainloop()
2.3 Entry窗口组件
Entry是一个单行文本输入域,类似HTML中的text
import tkinter as tk
window = tk.Tk()
window.title("window") #标题
window.geometry("500x300") #大小,中间是小写字母 "x"
# 创建标签显示entry内容
var = tk.StringVar()
l = tk.Label(window,textvariable=var,bg="green",font=("Arial",12),width=30,height=1)
l.pack()
def click_btn():
global var
str = "e1:"+e1.get() # entry取值
var.set(str)
e2.insert(0,e1.get()) # entry赋值
# 创建按钮
btn = tk.Button(window,text="click me",font=("Arial",12),width=10,height=1,command=click_btn)
btn.pack()
# 创建entry
e1 = tk.Entry(window,show="*",font=("Arial",12))
e2 = tk.Entry(window,show=None,font=("Arial",12))
e1.pack()
e2.pack()
window.mainloop()
2.4 Text组件
Text是文本域,用来收集和显示多行文本,格式化文本显示,支持内嵌图像和窗口
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
# 创建entry
e = tk.Entry(window, show=None, font=("Arial", 12))
e.pack()
def insert_point():
var = e.get()
t.insert("insert",var) # 从当前焦点处插入内容
def insert_end():
var = e.get()
t.insert("end",var) # 从文本末尾插入内容
b1 = tk.Button(window,text="insert point",width=10,height=2,command=insert_point)
b1.pack()
b2 = tk.Button(window,text="insert end",width=10,height=2,command=insert_end)
b2.pack()
t = tk.Text(window,height=3)
t.pack()
window.mainloop()
2.5 Listbox组件
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
var1 = tk.StringVar()
l = tk.Label(window,textvariable=var1,bg="green",fg="yellow",font=("Arial",12),width=30,height=1)
l.pack()
def print_selection():
# global var
if lb.curselection() is not (): # 未选择时为空元组
value = lb.get(lb.curselection()) # 获取当前选中的文本
var1.set(value)
b1 = tk.Button(window,text="print selection",width=10,height=2,command=print_selection)
b1.pack()
var2 = tk.StringVar()
var2.set((1,2,3,4))
lb = tk.Listbox(window,listvariable=var2)
list_items = [11,22,33,44]
for item in list_items:
lb.insert("end",item)
lb.insert(1,"first")
lb.insert(2,"second")
lb.delete(2)
lb.pack()
window.mainloop()
2.6 Radiobutton组件
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
var= tk.StringVar()
var.set("A")
l = tk.Label(window,text="",bg="yellow",font=("Arial",12),width=30,height=1)
l.pack()
def print_selection():
l.config(text="selected :" + var.get())
r1 = tk.Radiobutton(window,text="Option A",variable=var,value="A",command=print_selection)
r1.pack()
r1 = tk.Radiobutton(window,text="Option B",variable=var,value="B",command=print_selection)
r1.pack()
r1 = tk.Radiobutton(window,text="Option C",variable=var,value="C",command=print_selection)
r1.pack()
window.mainloop()
2.7 Checkbutton
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
l = tk.Label(window,text="",bg="yellow",font=("Arial",12),width=30,height=1)
l.pack()
def print_selection():
if (var1.get()==1)&(var2.get()==0):
l.config(text="choose only 1")
elif (var1.get()==0)&(var2.get()==1):
l.config(text="choose only 2")
elif (var1.get()==0)&(var2.get()==0):
l.config(text="choose neither 1 nor 2")
else:
l.config(text="choose both 1 and 2")
var1 = tk.IntVar()
var2 = tk.IntVar()
c1 = tk.Checkbutton(window,text="11111",variable=var1,onvalue=1,offvalue=0,command=print_selection)
c1.pack()
c2 = tk.Checkbutton(window,text="22222",variable=var2,onvalue=1,offvalue=0,command=print_selection)
c2.pack()
window.mainloop()
2.8 Scale滑动条组件
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
l = tk.Label(window,text="",bg="yellow",font=("Arial",12),width=30,height=1)
l.pack()
def print_selection(v):
l.config(text="selected :" + v)
# 长度200字符,0开始10结束,以2为刻度,精度0.01
s = tk.Scale(window,label="try me",from_=0,to=10,orient=tk.HORIZONTAL,length=200,showvalue=0,tickinterval=2,resolution=0.01,command=print_selection)
s.pack()
window.mainloop()
2.9 Canvas窗口组件
可绘制图表和图,创建图形编辑器,实现定制窗口部件
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
canvas = tk.Canvas(window,bg="green",height=200,width=500)
img_file = tk.PhotoImage(file="pic.gif")
img = canvas.create_image(250,0,anchor="n",image=img_file)
x0, y0, x1, y1 = 100, 100, 150, 150
line = canvas.create_line(x0-50, y0-50, x1-50, y1-50) # 画直线
oval = canvas.create_oval(x0+120, y0+50, x1+120, y1+50, fill='yellow') # 画圆 用黄色填充
arc = canvas.create_arc(x0, y0+50, x1, y1+50, start=0, extent=180) # 画扇形 从0度打开收到180度结束
rect = canvas.create_rectangle(330, 30, 330+20, 30+20)
canvas.pack()
def moveit():
canvas.move(rect, 2, 2) # 移动正方形rect(也可以改成其他图形名字用以移动一起图形、元素),按每次(x=2, y=2)步长进行移动
b = tk.Button(window, text='move item',command=moveit).pack()
window.mainloop()
图片锚定点位置参数图:
2.10 Menu组件
实现弹出式和下拉式菜单
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
l = tk.Label(window,width=30,height=2,bg="gray")
l.pack()
counter = 0
def do_job():
global counter
l.config(text="do"+str(counter))
counter += 1
menubar = tk.Menu(window)
filemenu = tk.Menu(menubar,tearoff=0) # 默认不展开菜单
menubar.add_cascade(label="File",menu=filemenu)
filemenu.add_command(label="New",command=do_job)
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.destroy)
window.config(menu=menubar)
window.mainloop()
2.11 Frame窗口组件
Frame是一个容器,可承载其他GUI元素,可以做区域划分
import tkinter as tk
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
tk.Label(window,text="on th window",bg="red").pack()
frame = tk.Frame(window)
frame.pack()
frame_l = tk.Frame(frame)
frame_r = tk.Frame(frame)
frame_l.pack(side="left")
frame_r.pack(side="right")
tk.Label(frame_l,text="on frame_l1").pack()
tk.Label(frame_l,text="on frame_l2").pack()
tk.Label(frame_l,text="on frame_l3").pack()
tk.Label(frame_r,text="on frame_r1").pack()
tk.Label(frame_r,text="on frame_r2").pack()
tk.Label(frame_r,text="on frame_r3").pack()
window.mainloop()
2.12 messageBox消息弹窗组件
import tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
tk.Button(window, text='click', bg='green', font=('Arial', 14), command=lambda title="info",
message="提示": tkinter.messagebox.showinfo(title=title,message=message)).pack()
tk.Button(window, text='click', bg='red', font=('Arial', 14), command=lambda title="info",
message="警告": tkinter.messagebox.showwarning(title=title,message=message)).pack()
tk.Button(window, text='click', bg='yellow', font=('Arial', 14), command=lambda title="info",
message="错误": tkinter.messagebox.showerror(title=title,message=message)).pack()
tk.Button(window, text='click', bg='green', font=('Arial', 14), command=lambda title="info",
message="询问": tkinter.messagebox.askquestion(title=title,message=message)).pack()
tk.Button(window, text='click', bg='red', font=('Arial', 14), command=lambda title="info",
message="询问对错": tkinter.messagebox.askyesno(title=title,message=message)).pack()
tk.Button(window, text='click', bg='yellow', font=('Arial', 14), command=lambda title="info",
message="询问取消": tkinter.messagebox.askokcancel(title=title,message=message)).pack()
window.mainloop()
3. 组件的三种布局方式
3.1 Grid表格布局
import tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
for i in range(3):
for j in range(3):
# row为行,column为列,padx单元格左右间距,pady单元格上下间距,ipadx单元格内部左右间距,ipady单元格内部上下间距
tk.Label(window,text=str((i+1)*(j+1))).grid(row=i,column=j,padx=10,ipadx=10,ipady=10)
window.mainloop()
3.2 Pack包装布局
import tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
tk.Label(window,text="上",bg="green").pack(side="top")
tk.Label(window,text="下",bg="red").pack(side="bottom")
tk.Label(window,text="左",bg="yellow").pack(side="left")
tk.Label(window,text="右",bg="gray").pack(side="right")
window.mainloop()
3.3 Place位置布局
import tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title("window") # 标题
window.geometry("500x300") # 大小,中间是小写字母 "x"
tk.Label(window,text="place布局",bg="green").place(x=50,y=100,anchor="nw")
window.mainloop()
4. 其他技巧
标准属性:
标准属性是所有控件的共同属性,如大小,颜色,字体等
属性 | 描述 |
Dimension | 控件大小; |
Color | 控件颜色; |
Font | 控件字体; |
Anchor | 锚点; |
Relief | 控件样式; |
Bitmap | 位图; |
Cursor | 光标; |