简单使用
基本框架
import tkinter as tk
# 创建窗口
window = tk.Tk()
# 设置窗口标题
window.title("This is demo")
# 设置窗口尺寸
window.geometry("500x300") # 设置窗口尺寸 长x宽
# window.resizable(width=False, height=False) # 设置窗口大小无法改变
# 窗口主循环
window.mainloop()
(Label)添加文本显示
import tkinter as tk
# 创建窗口
window = tk.Tk()
# 设置窗口标题
window.title("This is demo")
# 设置窗口尺寸
window.geometry("500x300") # 设置窗口尺寸 长x宽
##### 新增
l = tk.Label(window, text="This is a demo",bg="green", font=("Arial", 12), width=20, height=3)
l.pack()
#####
# 窗口主循环
window.mainloop()
(Button)添加按钮
import tkinter as tk
# 创建主窗口
window = tk.Tk()
# 设置窗口标题
window.title("This is demo1")
# 设置窗口尺寸
window.geometry("500x300")
##### 变化
var = tk.StringVar()
count = 0
l = tk.Label(window, textvariable=var,bg="green", font=("Arial", 12), width=20, height=3)
l.pack()
def hit_me():
global count
count += 1
var.set(f"you hit me {count}")
print(count)
b = tk.Button(window, text="hit me", font=("Arial",12), width=10, height=1, command=hit_me)
b.pack()
####
window.mainloop()
(Entry)添加单行文本输入
import tkinter as tk
window = tk.Tk()
window.title("This is demo2")
window.geometry("500x300")
# 显示明文
e1 = tk.Entry(window, show=None, font=("Arial", 14))
# 显示密文
e2 = tk.Entry(window, show="*", font=("Arial", 14))
e1.pack()
e2.pack()
window.mainloop()
(Text)多行文本区域
import tkinter as tk
window = tk.Tk()
window.title("This is demo3")
window.geometry("500x300")
e = tk.Entry(window, show=None)
e.pack()
def insert_point():
var = e.get()
t.insert("insert", var)
def insert_end():
var = e.get()
t.insert("end", var)
# 插入文本后是窗口聚焦到末尾
t.see("end")
b1 = tk.Button(window, text="insert", width=10, height=1, command=insert_point)
b2 = tk.Button(window, text="insert end", width=10, height=1, command=insert_end)
b1.pack()
b2.pack()
# 创建并放置一个多行文本框text用以显示,指定height=3为文本框是三个字符高度
t = tk.Text(window, height=3)
t.pack()
window.mainloop()
(Listbox)列表框部件
import tkinter as tk
window = tk.Tk()
window.title("This is demo4")
window.geometry("500x300")
var_l = tk.StringVar()
l = tk.Label(window, textvariable=var_l, font=("Arial", 14), width=10, height=3)
l.pack()
def show():
select = lb.curselection()
print("select",select, type(select))
if not select:
return
value = lb.get(select)
print("value", value, type(value))
var_l.set(value)
b = tk.Button(window, text="show select", command=show)
b.pack()
##### 新增
var = tk.StringVar()
var.set((1,2,3,4))
lb = tk.Listbox(window, listvariable=var)
'''
插入选项
lb.insert(1, "s1")
lb.insert(2, "s2")
lb.insert("end", "se")
'''
lb.pack()
#####
window.mainloop()
Radiobutton窗口部件
Radiobutton:代表一个变量,它可以有多个值中的一个。点击它将为这个变量设置值,并且清除与这同一变量相关的其它radiobutton
import tkinter as tk
window = tk.Tk()
window.title("radio button")
window.geometry("500x300")
var = tk.StringVar() # 获取选项值
def select():
print(f'get {var.get()}')
r1 = tk.Radiobutton(window, text="A",variable=var,value=1,command=select)
r1.pack()
r2 = tk.Radiobutton(window, text="B",variable=var,value=2,command=select)
r2.pack()
window.mainloop()
check button 勾选
import tkinter as tk
window = tk.Tk()
window.title("check button")
window.geometry("500x300")
def check_selection():
print(f"value {var1.get()}")
var1 = tk.IntVar()
c1 = tk.Checkbutton(window, text="option1", variable=var1, onvalue=1, offvalue=0, command=check_selection)
c1.pack()
window.mainloop()
Scale 滑块部件
import tkinter as tk
window = tk.Tk()
window.title("scale")
window.geometry("500x300")
def scaleValue(v):
print(f"scale {v}")
s = tk.Scale(window, label="try me", from_=0, to=10, orient=tk.HORIZONTAL, length=200, showvalue=1, \
tickinterval=2, resolution=0.01, command=scaleValue
)
s.pack()
window.mainloop()
Canvas 部件
Canvas:画布,提供绘图功能(直线、椭圆、多边形、矩形) 可以包含图形或位图,用来绘制图表和图,创建图形编辑器,实现定制窗口部件。
import tkinter as tk # 使用Tkinter前需要先导入
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('My Window')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300') # 这里的乘是小x
# 第4步,在图形界面上创建 500 * 200 大小的画布并放置各种元素
canvas = tk.Canvas(window, bg='green', height=200, width=500)
# 说明图片位置,并导入图片到画布上
image_file = tk.PhotoImage(file= "pic.gif") # 图片位置(相对路径,与.py文件同一文件夹下,也可以用绝对路径,需要给定图片具体绝对路径)
image = canvas.create_image(250, 0, anchor='n',image=image_file) # 图片锚定点(n图片顶端的中间点位置)放在画布(250,0)坐标处
# 定义多边形参数,然后在画布上画出指定图形
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()
# 第6步,触发函数,用来一定指定图形
def moveit():
canvas.move(rect, 2, 2) # 移动正方形rect(也可以改成其他图形名字用以移动一起图形、元素),按每次(x=2, y=2)步长进行移动
# 第5步,定义一个按钮用来移动指定图形的在画布上的位置
tk.Button(window, text='move item',command=moveit).pack()
# 第7步,主窗口循环显示
window.mainloop()
Menu 菜单条
Menu:菜单条,用来实现下拉和弹出式菜单,点下菜单后弹出的一个选项列表,用户可以从中选择
import tkinter as tk
window = tk.Tk()
window.title("Menu")
window.geometry("500x300")
def job1():
print("do job1")
# 创建一个菜单栏,这里我们可以把他理解成一个容器,在窗口的上方
menubar = tk.Menu(window)
# 创建一个File菜单项(默认不下拉,下拉内容包括New,Open,Save,Exit功能项)
filemenu = tk.Menu(menubar, tearoff=0)
# 将上面定义的空菜单命名为File,放在菜单栏中,就是装入那个容器中
menubar.add_cascade(label="File", menu=filemenu)
# 在File中加入New、Open、Save等小菜单,即我们平时看到的下拉菜单,每一个小菜单对应命令操作
filemenu.add_command(label="New", command=job1)
filemenu.add_command(label="Open", command=job1)
filemenu.add_command(label="Save", command=job1)
filemenu.add_separator() # 添加一条分隔线
filemenu.add_command(label="Exit", command=window.quit)
# 创建第二级菜单,即菜单项里面的菜单
submenu = tk.Menu(filemenu)
filemenu.add_cascade(label="Import", menu=submenu)
submenu.add_command(label="do1", command=job1)
# 创建菜单栏完成后,配置让菜单栏menubar显示出来
window.config(menu=menubar)
window.mainloop()
Frame 部件
Frame:框架,用来承载放置其他GUI元素,就是一个容器,是一个在 Windows 上分离小区域的部件, 它能将 Windows 分成不同的区,然后存放不同的其他部件. 同时一个 Frame 上也能再分成两个 Frame, Frame 可以认为是一种容器
import tkinter as tk
window = tk.Tk()
window.title("frame")
window.geometry("500x300")
# 创建一个主frame,长在主window窗口上
frame = tk.Frame(window)
frame.pack()
# 创建第二层框架frame,长在主框架frame上面
frame_l = tk.Frame(frame)
frame_l.pack(side="left")
frame_r = tk.Frame(frame)
frame_r.pack(side="right")
tk.Label(window, text='on the window', bg='red').pack()
tk.Label(frame, text='on the frame', bg='pink').pack()
tk.Label(frame, text='on the frame', bg='pink').pack()
tk.Label(frame_l, text='on the frame_l1', bg='green').pack()
tk.Label(frame_l, text='on the frame_l2', bg='green').pack()
tk.Label(frame_l, text='on the frame_l3', bg='green').pack()
tk.Label(frame_r, text='on the frame_r1', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r2', bg='yellow').pack()
tk.Label(frame_r, text='on the frame_r3', bg='yellow').pack()
window.mainloop()
messageBox窗口部件
弹出的消息窗口
import tkinter as tk
import tkinter.messagebox
window = tk.Tk()
window.title("messagebox")
window.geometry("500x300")
def hitMe():
tkinter.messagebox.showinfo(title='Hi', message='你好!') # 提示信息对话窗
# tkinter.messagebox.showwarning(title='Hi', message='有警告!') # 提出警告对话窗
# tkinter.messagebox.showerror(title='Hi', message='出错了!') # 提出错误对话窗
# print(tkinter.messagebox.askquestion(title='Hi', message='你好!')) # 询问选择对话窗return 'yes', 'no'
# print(tkinter.messagebox.askyesno(title='Hi', message='你好!')) # return 'True', 'False'
# print(tkinter.messagebox.askokcancel(title='Hi', message='你好!')) # return 'True', 'False'
tk.Button(window, text="hit me", command=hitMe).pack()
window.mainloop()
窗口部件放置的三种方式
grid
import tkinter as tk
window = tk.Tk()
window.title("grid")
window.geometry("500x300")
for i in range(3):
for j in range(3):
tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10, ipadx=10, ipady=10)
window.mainloop()
以上的代码就是创建一个三行三列的表格,其实 grid 就是用表格的形式定位的。这里的参数 row 为行,colum 为列,padx 就是单元格左右间距,pady 就是单元格上下间距,ipadx是单元格内部元素与单元格的左右间距,ipady是单元格内部元素与单元格的上下间距。
pack
import tkinter as tk # 使用Tkinter前需要先导入
# 第1步,实例化object,建立窗口window
window = tk.Tk()
# 第2步,给窗口的可视化起名字
window.title('My Window')
# 第3步,设定窗口的大小(长 * 宽)
window.geometry('500x300') # 这里的乘是小x
# 第4步,pack 放置方法
tk.Label(window, text='P', fg='red').pack(side='top') # 上
tk.Label(window, text='P', fg='red').pack(side='bottom') # 下
tk.Label(window, text='P', fg='red').pack(side='left') # 左
tk.Label(window, text='P', fg='red').pack(side='right') # 右
# 第5步,主窗口循环显示
window.mainloop()
place
import tkinter as tk
window = tk.Tk()
window.title("place")
window.geometry("500x300")
tk.Label(window, text="P", font=("Arial", 20)).place(x=25, y=100, anchor="nw")
window.mainloop()
再接下来我们来看place(), 这个比较容易理解,就是给精确的坐标来定位,如此处给的(50, 100),就是将这个部件放在坐标为(x=50, y=100)的这个位置, 后面的参数 anchor=‘nw’,就是前面所讲的锚定点是西北角。
自定义关闭窗口按钮
window.protocol("WM_BELETE_WINDOW", quit_func)
import tkinter as tk
def quit_new():
global new_w
windows.remove(new_w)
new_w.destroy()
new_w = None
def quit_all():
for w in windows:
w.destroy()
def new_window():
global new_w
if not new_w:
new_w = tk.Tk()
windows.insert(0, new_w)
new_w.title("new window")
new_w.geometry("400x300")
tk.Label(new_w, text="This is new window", bg="red").pack
new_w.protocol("WM_DELETE_WINDOW", quit_new)
new_w.mainloop()
windows=[]
window = tk.Tk()
new_w = None
windows.append(window)
window.title("window")
window.geometry("500x300")
tk.Button(window, text="new window", command=new_window)
window.protocol("WM_DELETE_WINDOW", quit_all)
window.mainloop()
主窗口关闭,子窗口随之关闭
Text用作信息显示框
import tkinter as tk
window = tk.Tk()
window.title("window")
window.geometry("500x300")
def show():
global count
count += 1
t.config(state="normal") # 设置text可编辑
t.insert("end", f"{count} This is info\n")
t.config(state="disabled") # 设置text不可编辑
t.see("end") # 使text显示末尾
count=0
btn = tk.Button(window, text="show info", command=show)
btn.pack()
t = tk.Text(window, height=7)
t.pack(side="bottom")
window.mainloop()
新建子窗口使用Toplevel
Toplevel 组件用来显示额外的窗口
新创建的窗口不需要使用mainloop
from tkinter import *
from time import strftime
def show(to_text, *args, ):
to_text.config(state="normal")
to_text.insert("end", f"{strftime('[%m-%d %H:%M:%S]')} {' '.join(map(lambda s:str(s),args))}\n")
to_text.config(state="disabled")
to_text.see("end")
def insert():
show(T, "insert", var.get())
var.set("")
def create():
global var,T
top = Toplevel()
top.title('window2')
top.geometry("400x300")
top.resizable(width=False, height=False)
T = Text(top, height=7)
T.config(state="disabled")
T.place(x=0, y=0)
Entry(top, textvariable=var, width=30).place(x=45,y=100)
Button(top, text="do", width=5, command=insert).place(x=290,y=100)
if __name__=="__main__":
window = Tk()
window.title("window")
var = StringVar()
T = None
Button(window, text='创建顶级窗口', command=create).pack()
window.mainloop()
如果将top = Toplevel
更换为 top = Tk()
后面创建的组件将无法使用 StringVar
获取和设置 Entry