tkinter 快速入门
窗口的设置
参考:https://www.cnblogs.com/zyg123/p/10351034.html
https://blog.csdn.net/qq_41556318/category_9283243.html?spm=1001.2014.3001.5482
import tkinter as tk
win = tk.Tk()
win.geometry("300x300+150+150") # 设置窗体的大小(300x300),窗体左上角(+150+150)
win.title("标题") # 设置标题
win.iconbitmap(r"C:\Users\Administrator\Pictures\1.ico") # 设置图标,以QQ头为例
win["background"] = "blue" # 设置背景色,以“蓝色”为例
win.attributes("-alpha", 0.6) # 设置透明度 值是:0~1 可以是小数点,0:全透明;1:全不透明
win.attributes("-toolwindow", True) # 设置窗口为工具样式:True 只有退出按钮,也没有图标; False 正常的窗体样式
win.attributes("-fullscreen", False) # 设置全屏:True 全屏;False 正常显示
win.attributes("-topmost", True) # 设置窗体置顶
win.overrideredirect(False) # 设置成脱离工具栏,True 没有工具栏按钮,即没有标题栏,没有退出按钮等。
screen_height = win.winfo_screenheight() # 获取屏幕的大小
screen_width = win.winfo_screenwidth()
win_height = win.winfo_height() # 获取窗体的大小;
win_width = win.winfo_width()
win_x = win.winfo_x() # 获取窗体的位置
win_y = win.winfo_y()
print(win_x, win_y, win_width, win_height, screen_width, screen_height)
win.mainloop()
Label控件
可选属性
text 标签显示的文本
font 设置文本的字体和大小
fg(foreground) 字体的颜色,
bg (background) 标签的背景色
width 标签的宽度(一个中文的字体宽为单位)
height 标签的高度(一个中文的字体高为单位)
padx 文字到边框的距离,水平方向
pady 文字到边框的距离,垂直方向
bd(borderwidth) 边框的宽度
relief 边框的样式
justify 文本对齐方式
image 图片
compound 图片与文字的混搭
anchor 方位
import tkinter as tk
import time
# 背景色与前景色
win = tk.Tk()
label_1 = tk.Label(win, text='fg="red" bg="blue"', fg="red", bg="blue")
# 字体与字体的大小
label_2 = tk.Label(win, text='font=("微软雅黑", 20)', font=("微软雅黑", 20))
# 宽度与高度,高度3,就是三行的高度
label_3 = tk.Label(win, text='width=10, height=3', bg="yellow", width=10, height=3)
label_4 = tk.Label(win, text='width=20, height=1', bg="yellow", width=20, height=1)
# 边距,文字到边框的距离,单位像素
label_5 = tk.Label(win, text='padx pady 默认', bg="blue")
label_6 = tk.Label(win, text='padx=0, pady=0', bg="blue", padx=0, pady=0)
label_7 = tk.Label(win, text='padx=10, pady=10', bg="blue", padx=10, pady=10)
# 对齐方式
label_8 = tk.Label(win, text="我是张一根,一匹想飞的狼,\n999号哦") # 居中对齐,默认
label_9 = tk.Label(win, text="我是张一根,一匹想飞的狼,\n999号哦", justify="left") # 左对齐
label_9 = tk.Label(win, text="我是张一根,一匹想飞的狼,\n999号哦", justify="right") # 右对齐
for i in range(1,10):
exec ("label_" + str(i) +".pack()") # 把字符串作为代码运行
# 导入图片 目前支持 .png 与 .gif 格式, 还不支持 .jpg格式
img1 = tk.PhotoImage(file=r"C:\Users\Administrator\Pictures\2.png")
# 在标签里放入图片,图片与文字混搭
tk.Label(win, image=img1).pack()
tk.Label(win, text="图文并茂", image=img1, compound="left").pack() # "right","center"
# bmp = tk.BitmapImage(file='logo.xbm')
# tk.Label(win,bitmap=bmp)
# 文字在标签框中的方位 "e","w","s","n","ne","se","nw","sw",就是东西南北八个方向
label_11 = tk.Label(win, text="方位是 N", bg="green", width=10, height=3, anchor="n") # 文字靠上(北)
label_11.pack()
# 边框样式与宽度 可选的参数有:默认flat(平的),sunken (沉没的, 凹下去的),raised (提高,凸出来的),ridge(脊,中键凸的)
label_12 = tk.Label(win, text='relief=sunken', relief="sunken", bd=5) # bd 边框宽度
label_12.pack()
# Label可变的文字内容
v = tk.StringVar() # 定义变量,必须是使用的是tk里的这个变量
v.set("这是刚开始的文字") # 使用v.set("string") 来定义变量
# 在标签里添加可变的文本
label_10 = tk.Label(win, textvariable=v, fg="red", bg="green", font=("黑体", 40))
label_10.pack()
while True:
v.set("%s" % time.ctime()) # 效果像一个时间表
label_10.update()
time.sleep(1)
win.mainloop()
Button控件
可选属性(大多数属性的设置参看Label控件,代码着重与Label不同的属性的设置)
text 按钮显示的文本 如果同时设置了image,则只显示图片,文本不显示
font 设置文本的字体和大小
fg(foreground) 字体的颜色,
bg (background) 标签的背景色
width 标签的宽度(一个中文的字体宽为单位)
height 标签的高度(一个中文的字体高为单位)
cursor 鼠标的样式
command 绑定事件
padx 文字到边框的距离,水平方向
pady 文字到边框的距离,垂直方向
bd(borderwidth) 边框的宽度
relief 边框的样式
justify 多行文本对齐方式
image 图片
compound 图片与文字的混搭
anchor 控制文本(或图像)在 Label 中显示的位置
import tkinter as tk
win = tk.Tk()
# 鼠标的样式 cursor="鼠标的属性值" pencil:笔型 circle:圆形 hand1:手型1 hand2:手型2
button1 = tk.Button(win, text="Button1", cursor="pencil") # 笔型
button1.pack()
# 边框样式 relief= "边框样式值" flat 无边框,groove 中间凹,ridge 中间凸,raised 往中间凸,solid 往中间凹,sunken 不可以
button1 = tk.Button(win, text="flat", relief="flat", bd=10)
button1.pack()
# 按钮的事件绑定,无参数
def button_command(): # 定义功能函数
print("你点击了按钮")
btn = tk.Button(win, text="确定", command=button_command) # 绑定事件
btn.pack()
# 按钮的事件绑定,有参数
def sum_fun(a, b):
result = a + b
print("%d + %d = %d" % (a, b, result))
button = tk.Button(win, text="传值事件", command=lambda: sum_fun(12, 13))
button.pack()
win.mainloop()
复选框Checkbutton控件
- tkinter里的变量:tk.Intvar()
用途:记录数值 - 其有两个方法:.get()获取值, .set()设置值
- 特有的属性
variable 控制变量
state 组件的状态,正常:normal 禁用:disabled
selectcolor 选中框内的颜色 - 专有方法
.select() 设置为选中
.delect() 设置为未选中
.toggle() 切换选中状态
import tkinter as tk
win = tk.Tk()
v = tk.IntVar() # 定义变量
v.set(0)
c = tk.Checkbutton(win, text="复选框", variable=v) # 添加复选框,设置command属性,可以像按钮一样调用回调函数
c.pack()
c.select()
print(v.get()) # 获取状态
win.mainloop()
单选框Radiobutton控件
- 特有属性
variable 控制变量 需要先定义tkinter里的变量:v = Intvar() v.set(),设置默认值 v.get(),获取选中的值
selectcolor 选中区域的颜色
import tkinter as tk
win = tk.Tk()
# frame = tk.Frame(win, bg="blue")
v = tk.IntVar() # 定义变量
v.set(2) # 设置第二个默认选中
r1 = tk.Radiobutton(win, text="one", value=1, variable=v) # 可以设置父窗口为frame
r1.pack() # 设置command属性,可以像按钮一样调用回调函数
r2 = tk.Radiobutton(win, text="two", value=2, variable=v) # 可以设置父窗口为frame
r2.pack()
print(v.get()) # 获取状态
win.mainloop()
Entry单行文本输入框
- 属性:
- 很多类似Label控件的,特殊的,如show="*",输入密码。state="normal"("disabled","readonly")
- takefocus=False,按tab键时避免焦点在此输入框中,默认是True。
- 方法:
- get() 控件.get() 或者v.get()(v是绑定变量)
- insert(index,text) 将 text 参数的内容插入到 index 参数指定的位置
- delete(first, last=None) 删除参数 first 到 last 范围内(包含 first 和 last)的所有内容
- icursor(index) 将光标移动到 index 参数指定的位置
- selection_range(start, end)
import tkinter as tk
master = tk.Tk()
def test():
if e1.get() == "CSDN":
print("正确!")
return True
else:
print("错误!")
e1.delete(0, "end") # 字符位置:数字索引号,从0开始。"anchor":对应第一个被选中的字符(如果有的话)
# "end":对应已存在文本的后一个位置。"insert":对应插入光标的当前位置。鼠标坐标("@x")
return False
def test2():
print("我被调用了......")
return True
v = tk.StringVar()
# validate验证选项:'focus'得到或失去焦点,'focusin'获得焦点,'focusout'失去焦点,'key'被编辑时,'all'以上任一,'none'关闭验证(默认)
# validatecommand:指定验证函数
# invalidcommand:如果验证函数返回Flase,调用此函数
e1 = tk.Entry(master, textvariable=v, validate="focusout", validatecommand=test, invalidcommand=test2)
e2 = tk.Entry(master)
e1.pack(padx=10, pady=10)
e2.pack(padx=10, pady=10)
master.mainloop()
Text控件
Text(文本)组件用于显示和处理多行文本。常常也被用于作为简单的文本编辑器和网页浏览器使用。
from tkinter import *
root = Tk()
text1 = Text(root,width=30, height=4) # 宽是30字符,高是4行
text1.insert(INSERT, 'I Love') #INSERT索引表示在光标处插入
text1.insert(END,' you') #END索引号表示在最后插入
text1.pack()
print(text1.get(1.2, 1.5)) # 行号以1开始 列号以0开始,后不包
text1.delete(1.0, END)
mainloop()
Frame与Labelframe 控件
Frame与Labelframe都是容器,用来存放其他控件,也是用来更好的管理布局。
大体上,Labelframe与Frame属性选项一样。Labelframe有两点不同于Frame:
1.Labelframe还可以在边框写文字,即:text="文字"
2.Frame用颜色区分其位置,Labelframe有边框
import tkinter as tk
win = tk.Tk()
# 定义Frame容器
frame_left = tk.Frame(win, bg="green")
# 定义LabelFrame容器,text显示在上边线上
frame_left1 = tk.LabelFrame(win, text="国家层面", labelanchor="n")
frame_left.pack() # frame上不放控件,将不显示
frame_left1.pack()
label_1 = tk.Label(frame_left, text="富强")
label_1.pack()
label_2 = tk.Label(frame_left1, text="富强")
label_2.pack()
win.mainloop()
画布carves控件
import tkinter as tk
win = tk.Tk()
win.geometry("600x400+200+100")
canvas = tk.Canvas(win, bg="orange") # 创建画布
canvas.place(relx=0.05, rely=0.05, relwidth=0.9, relheight=0.9)
line1 = canvas.create_line((0, 0), (100, 100), width=5, fill="red") # 画一条实线, fill:填充的颜色
canvas.create_line((200, 200), (200, 300), width=5, fill="green", dash=(1, 1)) # 画一条虚线 dash=(1, 1)
canvas.create_arc((100, 100), (200, 200), width=5) # 画一个圆弧
canvas.create_text((300, 100), text="文字", font=("微软雅黑", 18)) # 显示文字
canvas.create_rectangle(50, 25, 150, 75, fill='blue', outline='green', width=5) # 绘制矩形, outline:线条颜色
canvas.create_oval(200, 25, 350, 75, fill='pink', outline='green', width=5) # 绘制椭圆
point = [(100, 100), (100, 200), (200, 300), (300, 400), (400, 500)] # 绘制多边形
canvas.create_polygon(point, outline='green', fill='yellow')
def dele_line():
canvas.delete(line1)
btn = tk.Button(canvas, text="删除", command=dele_line)
btn.place(relx=0.4, rely=0.8)
win.mainloop()
Scale滑块控件
带数据的 Scrollbar(滚动条)组件,当你希望用户输入某个范围内的一个数值,使用 Scale 组件可以很好的代替 Entry 组件。
import tkinter as tk
root = tk.Tk()
def show(): # 方法:get(), set()
print(s1.get(), s2.get())
# tickinterval 设置显示的刻度,按照该值的倍数显示刻度.length 组件的长度(像素,默认100).
# resolution 指定 Scale 组件的分辨率,步长,即在凹槽点击一下鼠标左键它移动的数量。orient 水平放置还是垂直放置
s1 = tk.Scale(root, from_=0, to=42, tickinterval=5, length=200, resolution=5, orient="vertical").pack()
s2 = tk.Scale(root, from_=0, to=200, tickinterval=10, length=600, orient="horizontal").pack()
tk.Button(root, text="获得位置", command=show).pack()
root.mainloop()
Scrollbar滚动条
Scrollbar 组件通常几乎与 Text 组件、Canvas 组件和 Listbox 组件一起使用,水平滚动条还能跟 Entry 组件配合。
下边例子我们演示如何使用垂直滚动条。为了在某个组件上安装垂直滚动条,你需要做两件事:
- 设置该组件的 yscrollbarcommand 选项为 Scrollbar 组件的 set() 方法;
- 设置 Scrollbar 组件的 command 选项为该组件的 yview() 方法。
import tkinter as tk
root = tk.Tk()
sb = tk.Scrollbar(root)
sb.pack(side="right", fill="y")
lb = tk.Listbox(root, yscrollcommand=sb.set)
for i in range(1000):
lb.insert("end", str(i))
lb.pack(side="left", fill="both")
sb.config(command=lb.yview)
root.mainloop()
- 属性
- orient 1. 指定绘制 "horizontal"(垂直滚动条)还是 "vertical"(水平滚动条)2. 默认值是 VERTICAL
- command 1. 当滚动条更新时回调的函数 2. 通常的是指定对应组件的 xview() 或 yview() 方法
- jump 1. 指定当用户拖拽滚动条时的行为 2. 默认值是 False,滚动条的任何一丝变动都会即刻调用 command 选项指定的回调函数 3. 设置为 True 则当用户松开鼠标才调用
- width 1. 指定滚动条的宽度 2. 默认值是 16 像素
Listbox列表框控件
- 属性
- selectmode 四种不同的选择模式:"single"(单选)、"browse"(也是单选,默认,但拖动鼠标或通过方向键可以直接改变选项)、"multiple"(多选)和 "extended"(也是多选,但需要同时按住 Shift 键或 Ctrl 键或拖拽鼠标实现)
- listvariable 指向一个 StringVar 类型的变量,该变量存放 Listbox 中所有的项目. 在 StringVar 类型的变量中,用空格分隔每个项目,例如 var.set("鸡蛋 鸭蛋 鹅蛋 李狗蛋")
- height 1. 设置 Listbox 显示的行数(不是像素)2. 默认值是 10
- width 1. 设置 Listbox 的宽度(单位是文本单元)2. 文本单元是英文字母的平均宽度(所以如果该选项设置为 2,那么是无法容纳"ww"这两个宽度大于平均宽度的字母的)3. 默认值是 20
- 方法
- activate(index) 将给定索引号对应的选项激活(在其文本下方画一条下划线)
- delete(first, last=None) -- 删除参数 first 到 last 范围内(包含 first 和 last)的所有选项 -- 如果忽略 last 参数,表示删除 first 参数指定的选项
- insert(index, *elements) -- 添加一个或多个项目到 Listbox 中, -- 使用 lb.insert("end") 添加新选项到末尾
- get(first, last=None) -- 返回一个元组,包含参数 first 到 last 范围内(包含 first 和 last)的所有选项的文本,-- 如果忽略 last 参数,表示返回 first 参数指定的选项的文本
import tkinter as tk
master = tk.Tk()
theLB = tk.Listbox(master) # 创建一个空列表
theLB.pack()
# 往列表里添加数据
for item in ["鸡蛋", "鸭蛋", "鹅蛋", "李狗蛋"]:
theLB.insert("end", item)
theButton = tk.Button(master, text="删除", command=lambda x=theLB: x.delete("active"))
theButton.pack()
master.mainloop()
标准对话框模块
messagebox(消息对话框)
import tkinter as tk
from tkinter import messagebox
tk.messagebox.askokcancel("Python Demo", "发射核弹?")
tk.mainloop()
- 标准对话框样式函数
askokcancel(title, message, options) 确定 取消 返回 True 点击了“确定”或“是”按钮 False 点击了“取消”或“否”按钮
askquestion(title, message, options) 是 否 返回“yes”或“no”字符串
askretrycancel(title, message, options) 重试 取消 返回 True 点击了“确定”或“是”按钮 False 点击了“取消”或“否”按钮
askyesno(title, message, options) 是 否 按钮 返回 True 点击了“确定”或“是”按钮 False 点击了“取消”或“否”按钮
showerror(title, message, options) 返回“ok”表示用户按下了“是”按钮
showinfo(title, message, options) 返回“ok”表示用户按下了“是”按钮
showwarning(title, message, options) 返回“ok”表示用户按下了“是”按钮 - 参数
title 参数毋庸置疑是设置标题栏的文本
message 参数是设置对话框的主要文本内容,你可以用 '\n' 来实现换行
options 参数:icon=error(info,question。warning), parent=w 显示在子窗口
filedialog(文件对话框)
import tkinter as tk
from tkinter import filedialog
root = tk.Tk()
def callback():
fileName = tk.filedialog.askopenfilename() # 还有 asksaveasfilename()
print(fileName) # 如果用户选择了一个文件,返回值是该文件的完整路径,若用户点击了取消按钮,返回值是空字符串
tk.Button(root, text="打开文件", command=callback).pack()
root.mainloop()
- 参数
- defaultextension 指定文件的后缀,如:defaultextension=".jpg"
- filetypes 指定筛选文件类型的下拉菜单选项,该选项的值是由 2 元祖构成的列表,每个 2 元祖由(类型名,后缀)构成,例如:filetypes=[("PNG", ".png"), ("JPG", ".jpg"), ("GIF", ".gif")]
- initialdir 指定打开/保存文件的默认路径,默认路径是当前文件夹
colorchooser(颜色选择对话框)
fileName = tk.colorchooser.askcolor()
返回值:
- 如果用户选择一个颜色并按下“确定”按钮后,返回值是一个 2 元祖,第 1 个元素是选择的 RGB 颜色值,第 2 个元素是对应的 16 进制颜色值
- 如果用户按下“取消”按钮,那么返回值是 (None, None)
布局管理器(一):pack
pack 是按添加顺序排列组件.适用于少量组件的排列,相对复杂的布局结构,那么建议是使用多个框架(Frame)结构构成,或者使用 grid 管理器实现。
- 属性
- side 指定组件的放置位置,"top"(默认),"left"."right"."bottom"
- padx pady 控件在容器中指定水平、垂直方向上的外边距(如:padx=100,即控件左边右边距离容器的边都是100)
- ipadx ipady 控件内部的文字等子元素距离控件的边距
- anchor 控制组件在 pack 分配的空间中的位置,类似side,但是有八个方向,默认是“center”
- fill 指定方向上填充 pack 分配的空间,"x"(水平填充),"y"(垂直填充)和 "both"(水平和垂直填充)
- expand 指定是否填充父组件的额外空间
布局管理器(二):grid
grid 是按行/列形式排列组件。如果你只希望学习使用一个布局管理器,那么 grid 绝对是首选。
- 属性
- row column 指定组件插入的行、列(0 表示第 1 行、列)
- rowspan columnspan 指定用多少行、列(跨行列)显示该组件
- sticky 控制组件在 grid 分配的空间中的位置(默认居中),八个方向。加号(+)表示拉长填充,例如 "n" + "s" 表示将组件垂直拉长填充网格
- padx pady ipadx ipady 同pack
布局管理器(三):place
place 则允许程序员指定组件的大小和位置。通常情况下不建议使用 place 布局管理器,因为对比起 pack 和 grid,place 要做更多的工作。
- 属性
- x y 指定该组件的水平垂直偏移位置(像素),如同时指定了 relx 选项,优先实现 relx 选项
- relx rely 指定该组件相对于父组件的水平、垂直位置(取值范围 0.0 ~ 1.0)。0.5是中间
- relheight relwidth 指定该组件相对于父组件的高度、宽度(取值范围 0.0 ~ 1.0)
- height width 指定该组件的高度、宽度(像素)

浙公网安备 33010602011771号