Tkinter GUI编程攻略:Python图形化编程入门,20个实例助你一键开启学习之路
Tkinter GUI
目录
Tkinter GUI
1.点击Button按键实现弹框信息显示
2.主窗口位置和大小
3.GUI应用程序类的经典写法(面向对象)
4.Label标签
5.Entry单行文本框实现简单登录界面
6. 日期计算器
7.文件搜索工具
8.Text多行文本框
10.canvas画布
11.布局管理器
12.计算器界面的实现
13.钢琴按键界面的实现(可搭配语音生成函数)
14.扑克牌游戏
15.lambda表达式
16.三种事件的绑定
17.滑块测试
18.颜色框测试
19.文件选择框/读取文件内容
20.主菜单
1.点击Button按键实现弹框信息显示
**示例程序:**
import tkinter as tk
from tkinter import messagebox
root=tk.Tk()
root.title("测试")
root.geometry("200x50")
def show_info():
messagebox.showinfo("弹窗","这是一个测试案例弹窗!")
btn=tk.Button(root,text="测试按键",command=show_info)
btn.pack(pady=10)
root.mainloop()
**运行效果:**
2.主窗口位置和大小
**示例程序:**
import tkinter as tk
root=tk.Tk()
root.title("主窗口位置和大小")
#geometry("wxh±x±y")
#+x表示距离屏幕左边的距离 -x表示距离屏幕右边的位置
#+y表示距离屏幕上边的距离 -y表示距离屏幕下边的位置
root.geometry("300x300+500+300")
root.mainloop()
**运行效果:**
3.GUI应用程序类的经典写法(面向对象)
**示例程序:**
import tkinter as tk
from tkinter import messagebox
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.create_widget()
def create_widget(self):
btn1=tk.Button(self, text="测试", command=self.show_info)
btn1.pack(pady=30)
btn2=tk.Button(self,text="退出",command=self.exit)
btn2.pack(pady=30)
def show_info(self):
messagebox.showinfo("弹窗", "测试成功")
def exit(self):
root.destroy()
root=tk.Tk()
root.title("GUI应用程序类的测试")
root.geometry("400x200+500+300")
app=Application(master=root)
root.mainloop()
**运行效果:**
4.Label标签
**示例程序:**
import tkinter as tk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.create_widget()
self.show_labelinfo2()
#显示文本
def show_labelinfo1(self):
#label=tk.Label(self,text="你好,正在测试标签!",width=10,height=2,
# bg="blue",fg="white",font=("黑体",30))
label=tk.Label(self,text="你好,正在测试标签!")
label.pack(pady=10)
def show_labelinfo2(self):
label=tk.Label(self,text="你好\n世界",
borderwidth=2,relief="solid",justify="left")
label.pack(pady=20)
# 显示图像(展示接口)
def show_photoinfo(self):
global photo
label = tk.Label(self, image=tk.PhotoImage(file="xxx/xxx"))
label.pack(pady=10)
def create_widget(self):
btn=tk.Button(self, text="点击改变标签",
command=self.show_labelinfo1)
btn.pack(pady=10)
root=tk.Tk()
root.title("标签测试")
root.geometry("400x190+500+300")
app=Application(master=root)
root.mainloop()
**运行效果:**
5.Entry单行文本框实现简单登录界面
**示例程序:**
import tkinter as tk
from tkinter import messagebox
entry_id=''
entry_passward=''
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.login_info()
self.create_widget()
def login_info(self):
label1=tk.Label(self,text="账号")
label1.pack()
global entry_id
entry_id=tk.Entry(self)
entry_id.pack(pady=10)
label2=tk.Label(self,text="密码")
label2.pack()
global entry_passward
entry_passward = tk.Entry(self)
entry_passward.pack(pady=10)
def login(self):
id=str(entry_id.get())
passward=str(entry_passward.get())
if id=="张同学" and passward=="ztx806108":
messagebox.showinfo("登录响应","账号密码正确,登陆成功!")
else:
messagebox.showinfo("登录响应","账号密码错误,登陆失败!")
def create_widget(self):
btn1=tk.Button(self, text="登录",width=10, command=self.login)
btn1.pack(pady=10,side="left")
btn2=tk.Button(self,text="退出",width=10, command=root.destroy)
btn2.pack(pady=10,side="left")
root=tk.Tk()
root.title("文本输入测试")
root.geometry("400x200+500+300")
app=Application(master=root)
root.mainloop()
**运行效果:**
6. 日期计算器
**示例程序:**
import datetime as dt
import tkinter as tk
def show_time():
year1=int(entry_starty.get())
month1=int(entry_startm.get())
day1=int(entry_startm.get())
date1 = dt.datetime(year=year1, month=month1, day=day1)
year2=int(entry_endy.get())
month2=int(entry_endm.get())
day2=int(entry_endd.get())
date2 = dt.datetime(year=year2, month=month2, day=day2)
date=date2-date1
label.config(text=f"时间间隔: {date}!")
def exitapp():
root.destroy()
#创建主窗口
root = tk.Tk()
root.title("日期计算器")
root.geometry("1000x500")
#创建一个标签
label = tk.Label(root, text="欢迎来到日期计算器!")
# 标签在窗口中的位置间距
label.pack(pady=10)
# 创建按键并设置功能
button = tk.Button(root, text="时间间隔", command=show_time)
# 按键在窗口中的位置间距
button.pack(pady=20)
#创建空白输入框
#对空白输入框进行间距调整
label1= tk.Label(root, text="请输入起始年:")
label1.pack()
entry_starty = tk.Entry(root)
entry_starty.pack(pady=8)
label12= tk.Label(root, text="请输入起始月:")
label12.pack()
entry_startm = tk.Entry(root)
entry_startm.pack(pady=8)
label13= tk.Label(root, text="请输入起始日:")
label13.pack()
entry_startd = tk.Entry(root)
entry_startd.pack(pady=8)
label4= tk.Label(root, text="请输入结束年:")
label4.pack()
entry_endy = tk.Entry(root)
entry_endy.pack(pady=8)
label5= tk.Label(root, text="请输入结束月:")
label5.pack()
entry_endm = tk.Entry(root)
entry_endm.pack(pady=8)
label6= tk.Label(root, text="请输入结束日:")
label6.pack()
entry_endd = tk.Entry(root)
entry_endd.pack(pady=8)
#创建菜单栏
menu_bar = tk.Menu(root)
root.config(menu=menu_bar)
#创建文件菜单项
file_menu = tk.Menu(menu_bar, tearoff=0)
menu_bar.add_cascade(label="文件", menu=file_menu)
#添加退出选项功能
file_menu.add_command(label="退出", command=exitapp)
#主循环
root.mainloop()
**运行效果:**
7.文件搜索工具
**示例程序:**
import os
import tkinter as tk
def show_path():
file_path=entry_filepath.get()
pattern=entry_pattern.get()
for dirpath, _, filename in os.walk(file_path):
for f in filename:
if pattern in f:
label.config(text=f"{dirpath}\\{filename}")
#创建主窗口
root = tk.Tk()
root.title("文件路径搜索器")
root.geometry("350x155")
#创建空白输入框
#对空白输入框进行间距调整
label1= tk.Label(root, text="请输入查找文件路径:")
label1.pack()
entry_filepath = tk.Entry(root)
entry_filepath.pack()
label12= tk.Label(root, text="请输入搜索的关键词:")
label12.pack()
entry_pattern = tk.Entry(root)
entry_pattern.pack()
#创建一个标签
label = tk.Label(root, text="欢迎来到文件路径搜索器!")
# 标签在窗口中的位置间距
label.pack(pady=5)
# 创建按键并设置功能
button = tk.Button(root, text="查找文件路径", command=show_path)
# 按键在窗口中的位置间距
button.pack()
#主循环
root.mainloop()
**运行效果:**
8.Text多行文本框
**示例程序:**
import tkinter as tk
from tkinter import END
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.create_widget()
def create_widget(self):
self.w=tk.Text(self,width=40,height=20,bg="gray")#多行文本框
self.w.pack(pady=15)
self.btn1=tk.Button(self, text="保存文本内容", width=20,command=self.save_text)
self.btn1.pack(side="left")
self.btn2=tk.Button(self, text="清除文本内容",width=20, command=self.delete_text)
self.btn2.pack(side="left")
def save_text(self):
text_thing=self.w.get(1.0,END)
print(text_thing)
def delete_text(self):
self.w.delete(1.0,END)
root=tk.Tk()
root.title("文本框测试")
root.geometry("300x340+500+300")
app=Application(master=root)
root.mainloop()
**运行效果:**
9.Radiobutton单选和Checkbutton多选按键
**示例程序:**
import tkinter as tk
from tkinter import messagebox
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.create_widget1()
self.create_widget2()
btn=tk.Button(self,text="确定",command=self.show_info)
btn.pack(pady=20)
def create_widget1(self):
self.v= tk.StringVar()
self.v.set("无输入")
r1= tk.Radiobutton(self, width=10,text="男性",value= "man",variable=self.v)
r1.pack(pady=10)
r2= tk.Radiobutton(self,width=10, text="女性",value= "woman",variable=self.v)
r2.pack(pady=10)
def create_widget2(self):
self.codeHobby= tk.IntVar()
self.videoHobby=tk.IntVar()
c1=tk.Checkbutton(self,text="打代码",
variable=self.codeHobby,onvalue=1,offvalue=0)
c1.pack(pady=10)
c2=tk.Checkbutton(self,text="看视频",
variable=self.videoHobby,onvalue=1,offvalue=0)
c2.pack(pady=10)
def show_info(self):
if self.codeHobby.get()==1 and self.videoHobby.get()==1:
messagebox.showinfo("活动",f"您的性别为{self.v.get()},且参与的活动为:打代码+看视频!")
elif self.codeHobby.get()==1 and self.videoHobby.get()==0:
messagebox.showinfo("活动",f"您的性别为{self.v.get()},且参与的活动为:打代码!")
elif self.codeHobby.get()==0 and self.videoHobby.get()==1:
messagebox.showinfo("活动",f"您的性别为{self.v.get()},且参与的活动为:看视频!")
else:
messagebox.showinfo("活动",f"您的性别为{self.v.get()},且未参与任何活动!")
root=tk.Tk()
root.title("多功能按键测试")
root.geometry("300x250+500+300")
app=Application(master=root)
root.mainloop()
**运行效果:**
10.canvas画布
**示例程序:**
import random
import tkinter as tk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createwidget()
def createwidget(self):
self.canvas=tk.Canvas(self,width=350,height=350,bg="grey")
self.canvas.pack()
btn=tk.Button(self,text="随机生成一个矩形",command=self.drawpicture)
btn.pack(pady=5)
def drawpicture(self):
num1=int(self.canvas["width"])/2
num2=int(self.canvas["height"])/2
x1=random.randrange(int(num1))
y1=random.randrange(int(num2))
x2=x1+random.randrange(int(num1))
y2=y1+random.randrange(int(num2))
self.canvas.create_rectangle(x1,y1,x2,y2)
root=tk.Tk()
root.title("canvas画布")
root.geometry("400x400+100+100")
app=Application(master=root)
root.mainloop()
**运行效果:**
11.布局管理器
**示例程序:**
import tkinter as tk
from tkinter import EW
from tkinter import E
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createwidget1()
self.createwidget2()
def createwidget1(self):
label1=tk.Label(self,text="用户名")
label1.grid(row=0,column=0)
enter1=tk.Entry(self)
enter1.grid(row=0,column=1)
label2=tk.Label(self,text="密码")
label2.grid(row=1,column=0)
enter2=tk.Entry(self,show="*")
enter2.grid(row=1,column=1)
btn1=tk.Button(self,text="登录")
btn1.grid(row=2,column=1,sticky=EW)
btn2=tk.Button(self,text="退出")
btn2.grid(row=2,column=2,sticky=E)
def createwidget2(self):
f1=tk.Frame(root,width=200,height=200,bg="green")
f1.place(x=100,y=100)
tk.Button(root,text="aaa").place(relx=0.2,x=10,y=100,
relwidth=0.2,relheight=0.2)
tk.Button(f1,text="bbb").place(relx=0.6,rely=0.7)
root=tk.Tk()
root.title("布局管理器")
root.geometry("400x400+100+100")
app=Application(master=root)
root.mainloop()
**运行效果:**
12.计算器界面的实现
**示例程序:**
import tkinter as tk
from tkinter import EW, NSEW
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createwidget()
def createwidget(self):
list=["MC","M+","M-","MR",
"C","±","÷","×",
"7","8","9","-",
"4","5","6","+",
"1","2","3","=",
"0","."]
entry=tk.Entry(self)
entry.grid(row=0,column=0,columnspan=4,pady=5)
row=1
column=0
for i in range(0,22):
if i==20:
btn=tk.Button(self,text=list[i])
btn.grid(row=row,column=column,columnspan=2,sticky=EW)
elif i==21:
btn = tk.Button(self, text=list[i])
btn.grid(row=row, column=column+1, sticky=EW)
elif i==19:
btn = tk.Button(self, text=list[i])
btn.grid(row=row, column=column,rowspan=2,sticky=NSEW)
else:
btn=tk.Button(self,text=list[i])
btn.grid(row=row,column=column,sticky=EW)
column+=1
if column%4==0:
row+=1
column = 0
root=tk.Tk()
root.title("计算器")
root.geometry("180x220+100+100")
app=Application(master=root)
root.mainloop()
**运行效果:**
13.钢琴按键界面的实现(可搭配语音生成函数)
**示例程序:**
import tkinter as tk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createwidget()
def createwidget(self):
#Frame是一个矩形区域,就是用来放置其他子组件
f1=tk.Frame(root)
f1.pack()
f2=tk.Frame(root)
f2.pack()
btntext=["流行风","中国风","日本风","重金属","轻音乐"]
for i in range(0,5):
btn=tk.Button(f1,text=btntext[i])
btn.pack(side="left",padx=10)
for i in range(1,13):
label=tk.Label(f2,width=5,height=10,borderwidth=1,relief="solid",
bg="black"if i%2==0 else "white")
label.pack(side="left",padx=0)
root=tk.Tk()
root.title("钢琴按键")
root.geometry("500x210+100+100")
app=Application(master=root)
root.mainloop()
**运行效果:**
14.扑克牌游戏
**示例程序:**
import tkinter as tk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createwidget()
def createwidget(self):
len=0
self.photo1=tk.PhotoImage(file="pictures/img1.png")
puke=tk.Label(self.master,image=self.photo1)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo2=tk.PhotoImage(file="pictures/img2.png")
puke=tk.Label(self.master,image=self.photo2)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo3=tk.PhotoImage(file="pictures/img3.png")
puke=tk.Label(self.master,image=self.photo3)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo4=tk.PhotoImage(file="pictures/img4.png")
puke=tk.Label(self.master,image=self.photo4)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo5 = tk.PhotoImage(file="pictures/img5.png")
puke = tk.Label(self.master, image=self.photo5)
puke.place(x=10 + len * 70, y=50)
puke.bind_class("Label", "<1>", self.client)
len += 1
self.photo6=tk.PhotoImage(file="pictures/img6.png")
puke=tk.Label(self.master,image=self.photo6)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo7=tk.PhotoImage(file="pictures/img7.png")
puke=tk.Label(self.master,image=self.photo7)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo8=tk.PhotoImage(file="pictures/img8.png")
puke=tk.Label(self.master,image=self.photo8)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo9=tk.PhotoImage(file="pictures/img9.png")
puke=tk.Label(self.master,image=self.photo9)
puke.place(x=10+len*70,y=50)
puke.bind_class("Label","<1>",self.client)
len+=1
self.photo10 = tk.PhotoImage(file="pictures/img10.png")
puke = tk.Label(self.master, image=self.photo10)
puke.place(x=10 + len * 70, y=50)
puke.bind_class("Label", "<1>", self.client)
len += 1
def client(self, event=None):
if event.widget.winfo_y()==50:
event.widget.place(y=30)
else:
event.widget.place(y=50)
root=tk.Tk()
root.title("扑克牌")
root.geometry("900x400+100+100")
app=Application(master=root)
root.mainloop()
**运行效果:**
15.lambda表达式
**示例程序:**
import tkinter as tk
//后端控制台反馈
def test1():
print("普通按键测试:不涉及获取event对象,可以使用!")
def test2(a,b):
print("非普通按键:涉及获取event对象!"+"a={},b={}".format(a,b))
root=tk.Tk()
root.title("lambda使用情况测试")
root.geometry("140x50+100+100")
btn1=tk.Button(root,text="测试按键1",command=test1)
btn1.pack(side="left")
btn2=tk.Button(root,text="测试按键2",command=lambda: test2("aaa","bbb"))
btn2.pack(side="left")
root.mainloop()
**运行效果:**
16.三种事件的绑定
**示例程序:**
import tkinter as tk
def test1(event):
print("[左击] bind()方式绑定,可以获取到event对象!")
def test2(a,b):
print("a={},b={}".format(a,b))
print("command()方式绑定,不可以获取到event对象!")
def test3(event):
print("[右击] bind_class()方式绑定,可以获取到event对象!")
root=tk.Tk()
root.title("事件绑定")
root.geometry("200x30+100+100")
btn1=tk.Button(root,text="测试按键1")
btn1.pack(side="left")
btn1.bind("<Button-1>",test1)
btn2=tk.Button(root,text="测试按键2",command=lambda: test2("",""))
btn2.pack(side="left")
btn3=tk.Button(root,text="测试按键3")
btn3.pack(side="left")
btn3.bind_class("Button","<Button-3>",test3)
root.mainloop()
**运行效果:**
17.滑块测试
**示例程序:**
import tkinter as tk
from tkinter import HORIZONTAL
def function(event):
newevent=('宋体',event)
label.config(font=newevent)
root=tk.Tk()
root.title("测试")
root.geometry("400x200+100+100")
scale=tk.Scale(root,from_=10,to=50,length=200,tickinterval=5,orient=HORIZONTAL,command=function)
scale.pack(pady=20)
label=tk.Label(root,text="滑块测试")
label.pack(pady=20)
root.mainloop()
**运行效果:**
18.颜色框测试
**示例程序:**
import tkinter as tk
from tkinter.colorchooser import askcolor
def setcolour():
s=askcolor(color="red",title="选择背景色")
root.config(bg=s[1])
root=tk.Tk()
root.title("测试")
root.geometry("400x200+100+100")
btn=tk.Button(root,text="修改背景色",command=setcolour)
btn.pack(pady=10)
root.mainloop()
**运行效果:**
19.文件选择框/读取文件内容
**示例程序:**
import tkinter as tk
from tkinter.filedialog import askopenfilename, askopenfile
def test():
f=askopenfilename(title="上传文件",initialfile="d:",filetypes=[("图片文件",".png"),("视频文件",".mp4")])
label["text"]=f
def test1():
with askopenfile(title="读取文件",initialfile="d:",filetypes=[("文本文件",".txt")]) as f:
label["text"]=f.read()
root=tk.Tk()
root.title("测试")
root.geometry("400x200+100+100")
btn1=tk.Button(root,text="选择编辑的文件",command=test)
btn1.pack()
btn2=tk.Button(root,text="读取编辑的文件",command=test1)
btn2.pack()
label=tk.Label(root,width=100,height=50,bg="grey")
label.pack()
root.mainloop()
**运行效果:**
20.主菜单
**示例程序:**
import tkinter as tk
class Application(tk.Frame):
def __init__(self,master=None):
super().__init__(master)
self.master=master
self.pack()
self.createwidget()
def createwidget(self):
#创建主菜单栏
menubar=tk.Menu(root)
#创建主菜单栏下的菜单项
menufile=tk.Menu(menubar)
menuedit=tk.Menu(menubar)
menuhelp=tk.Menu(menubar)
#将菜单项添加入到菜单栏
menubar.add_cascade(label="文件(F)",menu=menufile)
menubar.add_cascade(label="编辑(E)",menu=menuedit)
menubar.add_cascade(label="帮助(H)",menu=menuhelp)
#创建菜单项下的子功能
menufile.add_command(label="新建",accelerator="ctrl+n",command=self.func1)
menufile.add_command(label="打开",accelerator="ctrl+o",command=self.func2)
menufile.add_command(label="保存",accelerator="ctrl+s",command=self.func3)
menufile.add_separator()
menufile.add_command(label="退出",accelerator="ctrl+q",command=root.destroy)
#将主菜单栏加载到根窗口
root["menu"]=menubar
#具体实现补充相应的接口功能块
def func1(self):
pass
def func2(self):
pass
def func3(self):
pass
if __name__== '__main__':
root=tk.Tk()
root.title("主菜单测试")
root.geometry("400x200+100+100")
app=Application(master=root)
root.mainloop()
**运行效果:**
作者:张同学的IT技术日记