欢迎光临散文网 会员登陆 & 注册

爆肝6小时,只为让你学会Tkinter!

2023-07-22 16:13 作者:Pumpkin888666  | 我要投稿

本文转自我的博客,原文链接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标签要在那个窗口对象的意思。



textLabel标签显示的文字,可以为空。



bgLabel标签的背景颜色。



fontLabel标签显示的文字的字体和字号。



widthLabel标签的宽度,以字符为单位。



heigthLabel标签的高度。



扩展:



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意思是当单选框选中后将此定义的内容传入绑定的变量。



commandRadiobutton被按下要执行的函数指令。



扩展:



要获得被绑定的变量的内容要用到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传入绑定的变量。



commandCheckbutton被按下要执行的函数指令。



扩展:



要获得被绑定的变量的内容要用到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的背景颜色。



heightCanvas的高度。



widthCanvas的宽度。



扩展



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=0extent=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就是在那个方位。暂时只试出leftright,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指锚定点。

本文档到此结束

以上教程都是博主学习后总结而来,如果有错误的地方,欢迎评论指出错误。






爆肝6小时,只为让你学会Tkinter!的评论 (共 条)

分享到微博请遵守国家法律