爆肝6小时,只为让你学会Tkinter!
本文转自我的博客,原文链接https://pumpkin8.com/119.html
Tkinter是一个Python自带的GUI库,可以使用他做出一些简易的GUi界面,使你的Python功能变得可交互,给人一种直观感受。
由于我手滑给将我做了一晚上的文件删掉了,所以只能借用B友”晓学森JUN”提供的文件:链接:https://pan.baidu.com/s/1glbJTC6EMsRmJAUra9fN9A提取码:wz7i
1.GUI窗口基本的配置以及如何创建
引入模块
import tkinter as tk
实例化对象
root = tk.Tk()
窗口的标题
root.title('title')
窗口大小
root.geometry("500x400")
注意,中间是小写”x“.
显示窗口
root.mainloop()
2.Tkinter的一些模块及可选参数
Label
Label标签用于显示一些不可修改的文字和图标。
创建Label
l = tk.Label(root,text="文字",bg='green',font=('Arial,12'),width=15,height=2)
l.pack
参数详解:
root
是Label标签要在那个窗口对象的意思。
text
Label标签显示的文字,可以为空。
bg
Label标签的背景颜色。
font
Label标签显示的文字的字体和字号。
width
Label标签的宽度,以字符为单位。
heigth
Label标签的高度。
扩展:
Label标签显示的文字可以修改,并不是一味不变,有一下几种方式:
1.使用变量
变量必须是使用Tkinter
提供的StringVar
这种字符串变量。如
var = tk.StringVar
然后,并不可以直接写text=var
而是使用textvariable
。如
textvariable=var
然后,在修改变量时并不能直接赋值,需要使用set命令。如
var.set("内容")
此方法的案例:
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
var = tk.StringVar()
l = tk.Label(root,textvariable=var,bg='green',font=('Arial,12'),width=15,height=2)
l.pack()
def hit():
var.set("按钮被点击")
b=tk.Button(root,text='按钮',bg='white',font=("Arial,12"),width=15,height=2,command=hit)
b.pack()
root.mainloop()
可能有一些代码你不懂,不用担心,将会在下面继续讲到。
2.直接使用config
修改
使用此方法,Label标签可以直接使用text参数而不需要改变。但是修改它必须使用config命令。如
l.config(text="内容" )
此方法不仅适用于修改文字,也可以修改其它的参数。
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
l = tk.Label(root,text="Label",bg='green',font=('Arial,12'),width=15,height=2)
l.pack()
root.mainloop()
Button
Button是一个按钮,仅此而已。
创建Button:
b=tk.Button(root,text='按钮',bg='white',font=("Arial,12"),width=15,height=2,command=hit)
b.pack()
参数详解:
root
是按钮要在那个窗口对象的意思。
text
按钮显示的文字,可以为空。
bg
按钮的背景颜色。
font
按钮显示的文字的字体和字号。
width
按钮的宽度,以字符为单位。
heigth
按钮的高度。
command
按钮被按下要执行的函数指令
扩展:
可以使用config
命令修改参数。如
b.config(修改的参数)
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
b = tk.Button(root,text="Button",bg='green',font=('Arial,12'),width=15,height=2)
b.pack()
root.mainloop()
Entry
Entry是一个输入框部件。
创建Entry
e = tk.Entry(root,show=None)
参数详解:
root
是Entry要在那个窗口对象的意思。
show
是用户键入的文字需要用什么替代,适用于输入密码的输入框。None
表示不用替换,明文显示,而若想替换,则需使用show="*"
来显示,当然,*
可以替换。
扩展:
1.需要获得输入框的内容,要用到get
命令。如
e.get()
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
e1 = tk.Entry(root,show=None)
e1.pack()
e2 = tk.Entry(root,show="*")
e2.pack()
root.mainloop()
Text
Text模块是一个文本框,用户可以修改里面的内容。
创建Text
t = tk.Text(root,height=2)
参数详解:
root
是Listbox要在那个窗口对象的意思。
height
文本框能显示的字符行数,2代表只能显示两行的字符。
扩展:
在文本框插入内容,使用insert
。如
t.insert("位置",内容)
位置
插入的位置。insert
是插入到光标后面。end
是插入到最后。
内容
插入的内容。如123或一个变量。
Listbox
Listbox是一个列表,用于显示内容。
创建Listbox
var2 = tk.StringVar()
var2.set((11,22,33,44))
lb = tk.Listbox(root,listvariable=var2)
lb.pack()
参数详解:
root
是Listbox要在那个窗口对象的意思。
listvariable
是它要显示的内容。
扩展:
1.列表末尾插入数据
list_items = [1,2,3,4]
for item in list_items:
lb.insert("end",item)
list_items
是要插入的数据
2.指定列表位置插入数据
lb.insert(位置,'内容')
位置
例如1,2
内容
例如first,second
3.删除列表指定位置的内容
lb.delete(位置)
位置
例如1,2
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
var2 = tk.StringVar()
var2.set((11,22,33,44))
lb = tk.Listbox(root,listvariable=var2)
list_items = [1,2,3,4]
lb.pack()
root.mainloop()
Radiobutton
Radiobutton相当于一个单选框。
创建Radiobutton
var = tk.StringVar()
r1 = tk.Radiobutton(root,text='OptionA',
variable=var,value="A",
command=print_selection)
r1.pack()
r2 = tk.Radiobutton(root,text='OptionB',
variable=var,value="B",
command=print_selection)
r2.pack()
r3 = tk.Radiobutton(root,text='OptionC',
variable=var,value="C",
command=print_selection)
r3.pack()
参数详解:
root
是Radiobutton要在那个窗口对象的意思。
text
是Radiobutton要显示的文本。
variable=var
相当于把var 变量绑定到Radiobutton。
value
意思是当单选框选中后将此定义的内容传入绑定的变量。
command
Radiobutton被按下要执行的函数指令。
扩展:
要获得被绑定的变量的内容要用到get
如
var.get()
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
var = tk.StringVar()
l = tk.Label(root,bg='green',width=25,
text="empty")
l.pack()
def print_selection():
l.config(text="you have selected=>" + var.get())
r1 = tk.Radiobutton(root,text='OptionA',
variable=var,value="A",
command=print_selection)
r1.pack()
r2 = tk.Radiobutton(root,text='OptionB',
variable=var,value="B",
command=print_selection)
r2.pack()
r3 = tk.Radiobutton(root,text='OptionC',
variable=var,value="C",
command=print_selection)
r3.pack()
root.mainloop()
Scale
Scale模块是一个可拖动的拉动条。
创建Scale
sc = tk.Scale(root,label='try me',from_=0,to=10,orient=tk.HORIZONTAL,length=200,showvalue=0,tickinterval=2,resolution=0.1,command=print_selection)
sc.pack()
参数详解:
root
是Scale要在那个窗口对象的意思。
label
是scale部件的名称。
from_=5,to=11
的意思就是从5到11,即这个滚动条最小值为5,最大值为11(这里使用from_是因为在python中有from这个关键词)
orient=tk.HORIZONTAL
在这里就是设置滚动条的方向,这里HORIZONTAL
就是横向。VERTICAL
就是竖向。
length
这里是指滚动条部件的长度,但注意的是和其他部件width表示不同,width表示的是以字符为单位,比如width=4
,就是4个字符的长度,而此处的length=200
,是指我们常用的像素为单位,即长度为200个像素。
resolution=0.01
此处的0.01就是保留2位小数。0.1就是1位小数。类似数学题。
showvalue
就是在滚动条上方是否显示提示。showvalue=0
是不显示,showvalue=1
是显示。
tickinterval
就是提示格几个显示。如tickinterval=2
就是5.00 7.00 ……,tickinterval=3
就是5.00 8.00…..。
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
l = tk.Label(root,bg='green',width=25,
text="empty")
l.pack()
def print_selection(v):
l.config(text="you have selected" + v)
sc = tk.Scale(root,label='try me',from_=0,to=10,
orient=tk.VERTICAL,length=200,
showvalue=0,tickinterval=2,resolution=0.1,
command=print_selection)
sc.pack()
root.mainloop()
功能print_selection (v)
,这里的参数v
即拖动条的位置数据。
Checkbutton
Checkbutton与Radiobutton相反,这相当于一个多选框。
创建Checkbutton
var1 = tk.IntVar()
var2 = tk.IntVar()
cb1 = tk.Checkbutton(root,text='Python',variable=var1,
onvalue=1,offvalue=0,
command=print_selection)
cb1.pack()
cb2 = tk.Checkbutton(root,text="C++",variable=var2,
onvalue=1,offvalue=0,
command=print_selection)
cb2.pack()
参数详解:
root
是Checkbutton要在那个窗口对象的意思。
text
是Checkbutton要显示的文本。
variable=var1
相当于把var1 变量绑定到Checkbutton。
onvalue=1
意思是当选框选中后将1传入绑定的变量。
offvalue=0
意思是当选框未选中将0传入绑定的变量。
command
Checkbutton被按下要执行的函数指令。
扩展:
要获得被绑定的变量的内容要用到get
如
var.get()
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("500x400")
l = tk.Label(root,bg='green',width=25,
text="empty")
l.pack()
def print_selection():
if (var1.get()==1)&(var2.get()==0):
l.config(text='I love only Python')
elif (var1.get()==0)&(var2.get()==1):
l.config(text="I love only C++")
elif (var1.get()==0)&(var2.get()==0):
l.config(text="I don't love either")
else:
l.config(text='I love both')
var1 = tk.IntVar()
var2 = tk.IntVar()
cb1 = tk.Checkbutton(root,text='Python',variable=var1,
onvalue=1,offvalue=0,
command=print_selection)
cb1.pack()
cb2 = tk.Checkbutton(root,text="C++",variable=var2,
onvalue=1,offvalue=0,
command=print_selection)
cb2.pack()
root.mainloop()
Canvas
Canvas是一个画布模块,你可以在上面放置Gif图片(我尝试Jpg,Png都无法放置,有知道的人可以评论指出),和画出简易线条等。
创建Canvas
canvas = tk.Canvas(root, bg='blue', height=100, width=200)
canvas.pack()
参数详解:
root
是Canvas要在那个窗口对象的意思。
bg
就是Canvas的背景颜色。
height
Canvas的高度。
width
Canvas的宽度。
扩展
1.放置Gif图片
image_file = tk.PhotoImage(file='D:/Code/code/Python/库/Tkinter/ins.gif')
image = canvas.create_image(10, 10, anchor='nw', image=image_file)
image_file
是一个变量,用于存储Gif图片信息。后面的file="路径"
是图片的路径,这里只是我的示例路径,你可以更改。
10,10
是Gif放在何处的坐标,以anchor
为锚定点,nw,ne,sw,se,e,w,n,s
分别对应左上,右上,左下,右下,右,左,上,下。
2.画线
x0,y0,x1,y1=50,50,80,80
line = canvas.create_line(x0,y0,x1,y1)
x0,y0,x1,y1
创建变量储存坐标信息。
line=canvas.create_line(x0,y0,x1,y1)
画一条线,从第一个坐标x0,y0画到第二个坐标x1,y1。
3.画圆
x0,y0,x1,y1=50,50,80,80
oval = canvas.create_oval(x0,y0,x1,y1,fill='red')
x0,y0,x1,y1
创建变量储存坐标信息。
oval=canvas.create_oval(x0,y0,c1,y1,fill="red")
画一个圆,以第一个坐标x0,y0到第二个坐标x1,y1的连线为直径画圆,fill="red"
是填充色,红色。
4.创建矩形
rect = canvas.create_rectangle(100, 30, 100+20, 30+20)
100,30
是起始坐标xy,100+20,30+20
是指,在x坐标100下增加20为长,在y坐标30下增加20为宽。
5.创建扇形
arc = canvas.create_arc(x, y, x+30, y+30, start=0, extent=180)
x,y
是起始坐标。
x+30,y+30
是指在起始坐标上偏移多少做弧线,建议相等,因为这相当于半径。
start=0
和extent=180
,是指起始角度为0度最终角度是180度。以一个量角器的右边是0度。
6.移动部件
canvas.move(oval,2,2)
这里以移动圆为案例,在上面,我们把oval
变量用于储存圆的数据,这里就用到了变量,然后,后面的坐标指在原有的xy坐标上偏移这个值。
此模块的示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("300x200")
canvas = tk.Canvas(root,bg='blue',height=100,width=200)
image_file = tk.PhotoImage(file='D:/Code/code/Python/库/Tkinter/ins.gif')
image = canvas.create_image(30, 30, anchor='w', image=image_file)
x0,y0,x1,y1=50,50,80,80
line = canvas.create_line(x0,y0,x1,y1)
oval = canvas.create_oval(x0,y0,x1,y1,fill='red')
rect = canvas.create_rectangle(100, 30, 100+20, 30+50)
arc = canvas.create_arc(x0, y0, x1+30, y1+30, start=0, extent=180)
canvas.pack()
def moveit():
canvas.move(oval,2,2)
b = tk.Button(root,text='move',command=moveit).pack()
root.mainloop()
Menu
Meun模块是一个菜单栏模块,存在于窗口顶部,用于用户交互。点我查看示例图片
首先,我们创建一个菜单容器,就是图片的顶部那一个长条,用于存放菜单选项。
menu = tk.Menu(root)
root.config(menu=menu)
参数详解:
root
就是Menu要放在那个窗口的意思。
root.config(menu=menu)
是指,将窗口root
的菜单栏设为我们设好的菜单容器(左边的menu
),因为重名所以有点别扭。
随后,在创建一个菜单选项,就是图中file,edit选项。
file_menu = tk.Menu(menu, tearoff=0)
参数详解:
menu
就这个菜单选项要放在哪一个菜单容器里。
tearoff
就是它能不能被分开。0是不能,1是能。建议不能,若允许分开,点击菜单选项会新建弹窗。
把这个菜单选项加进menu
的菜单容器内。
menu.add_cascade(label='File', menu=file_menu)
参数详解:
label
是指这个选项要在容器内显示什么名字。
menu
是指把啥菜单选项添加进这个容器内。
最后,在这个菜单选项里增加功能选项。
file_menu.add_cascade(label='New', command=do_job)
参数详解:
label
是指这个功能要显示什么名字。
command
当这个选项被按下要执行的函数指令。
扩展
1.在菜单选项中增加分割线,使用add_separator()
命令。如
file_menu.add_separator()
2.在菜单 选项中套娃。
就是将一个菜单选项定义成一个容器,在里面放置一个菜单选项。
submenu = tk.Menu(file_menu)
file_menu.add_cascade(label='import', menu=submenu,underline=0)
submenu.add_command(label='Submenu', command=do_job)
underline
只是一个参数,暂时不用管。
此模块的示例代码
root = tk.Tk()
root.title('title')
root.geometry("300x200")
lb = tk.Label(root,text=' ', bg='yellow')
lb.pack()
count = 0
def do_job():
global count
lb.config(text='do'+str(count))
count += 1
menu = tk.Menu(root)
file_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label='File', menu=file_menu)
file_menu.add_cascade(label='New', command=do_job)
file_menu.add_cascade(label='Open', command=do_job)
file_menu.add_cascade(label='Save', command=do_job)
file_menu.add_cascade(label='Delete', command=do_job)
file_menu.add_separator()
file_menu.add_cascade(label='Exit', command=root.quit)
edit_menu = tk.Menu(menu, tearoff=0)
menu.add_cascade(label='Edit', menu=edit_menu)
edit_menu.add_cascade(label='Cut', command=do_job)
edit_menu.add_cascade(label='Copy', command=do_job)
edit_menu.add_cascade(label='Paste', command=do_job)
submenu = tk.Menu(file_menu)
file_menu.add_cascade(label='import', menu=submenu,underline=0)
submenu.add_command(label='Submenu', command=do_job)
root.config(menu=menu)
root.mainloop()
Frame
Frame相当于是窗口中的窗口,可以显示一些部件,可以合理规划位置。
创建主Frame
frm = tk.Frame(root)
frm.pack()
参数详解:
root
就是Frame要在那个窗口的意思。
在主Frame中创建两个Frame模块。
frm_l = tk.Frame(frm)
frm_r = tk.Frame(frm)
frm
就是这两个Frame要在那个Frame模块中。
随后,设置这些Frame的位置。
frm_l.pack(side='left')
frm_r.pack(side='right')
side
就是在那个方位。暂时只试出left
,right
,top
这些,如果你了解的话可以评论指出。
最后,在Frame中加入模块。
tk.Label(frm_l,text='on the frm_l1').pack()
tk.Label(frm_l,text='on the frm_l2').pack()
tk.Label(frm_r,text='on the frm_rl').pack()
frm_l
就是这些部件要在哪个Frame中。
此模块示例代码
import tkinter as tk
root = tk.Tk()
root.title('title')
root.geometry("300x200")
tk.Label(root,text='on the windows').pack()
frm = tk.Frame(root)
frm.pack()
frm_l = tk.Frame(frm)
frm_r = tk.Frame(frm)
frm_l.pack(side='left')
frm_r.pack(side='right')
tk.Label(frm_l,text='on the frm_l1').pack()
tk.Label(frm_l,text='on the frm_l2').pack()
tk.Label(frm_r,text='on the frm_rl').pack()
root.mainloop()
Messagebox
Messagebox是一个弹窗部件,用于提醒消息,报错,警告,选择。
使用这个模块,需要额外引用库。
import tkinter.messagebox
创建消息框
tkinter.messagebox.showinfo(title='八个南瓜', message='pumpkin8.com')
创建警告框
tkinter.messagebox.showwarning(title='八个南瓜', message='pumpkin8.com')
创建错误框
tkinter.messagebox.showerror(title='八个南瓜', message='pumpkin8.com')
创建选择框
tkinter.messagebox.askquestion(title='八个南瓜', message='pumpkin8.com')
参数详解:
title
就是窗口名称
message
就是内容
扩展
可以使用print
来输入用户选项,也可以变量赋值。
此模块的示例代码
import tkinter as tk
import tkinter.messagebox
root = tk.Tk()
root.title('title')
root.geometry("300x200")
def hit():
tkinter.messagebox.showinfo(title='Hi', message='你好')
tkinter.messagebox.showwarning(title='八个南瓜', message='pumpkin8.com')
tkinter.messagebox.showerror(title='八个南瓜', message='pumpkin8.com')
tkinter.messagebox.askquestion(title='八个南瓜', message='pumpkin8.com')
tk.Button(root, text='hit', width=10,height=2, command=hit).pack()
root.mainloop()
模块放置位置
模块放置的方法有三种。
1.Pack
tk.Label(window, text='1').pack(side='top')#上
tk.Label(window, text='1').pack(side='bottom')#下
tk.Label(window, text='1').pack(side='left')#左
tk.Label(window, text='1').pack(side='right')#右
2.grid
我运行报错,有知道的可以评论指出
for i in range(4):
for j in range(3):
tk.Label(window, text=1).grid(row=i, column=j, padx=10, pady=10)
3.Place
tk.Label(window, text=1).place(x=20, y=10, anchor='nw')
anchor
指锚定点。
本文档到此结束
以上教程都是博主学习后总结而来,如果有错误的地方,欢迎评论指出错误。