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()

图片锚定点位置参数图:


python tkinter Label标签不显示_Text

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

光标;