合集篇–python GUI之tkinter
3.22
python GUI之tkinter
目录:
1、什么是GUI
2、tkinter之Tk窗口添加
3、tkinter之Tk组件添加
4、tkinter之Tk菜单添加
本期内容信息量很大,小伙伴们可以先收藏,方便随时回看哦~
1
什么是GUI

Tkinter用于制作程序GUI界面的pthon官方内置库
Tkinter优点:简单、易上手、跨平台Windows、macOS和Linux多种操作系统上运行
Tkinter缺点:基础功能、界面不太好看
GUI除了Tkinter还有wxPython、PyQT等GUI三方库,比Tkinter复杂,建议先学Tk,再学其他
官方技术文档:
https://docs.python.org/zh-cn/3/library/tk.html
2
tkinter之Tk窗口添加
(1)创建窗口、开启窗口/主循环、设置窗口标题
# 创建窗口# 开启窗口/主循环#设置窗口标题import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 开启窗口/主循环a1.mainloop()

(2)设置窗口大小、设置窗口打开位置、获取用户分辨率
# 设置窗口大小# 设置窗口打开位置# 获取用户分辨率import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 获取用户分辨率a2 = a1.maxsize()k, g = a2# 设置窗口大小# 设置窗口打开位置a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}+{int(k*0.1)}+{int(g*0.1)}')# a1.geometry('宽x高+距离屏幕左侧多少+距离屏幕上方多少')# 开启窗口/主循环a1.mainloop()

(3)设置窗口锁定缩放、设置窗口图标
# 设置窗口锁定缩放# 设置窗口图标import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 获取用户分辨率a2 = a1.maxsize()k, g = a2# 设置窗口大小# 设置窗口打开位置a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}+{int(k*0.1)}+{int(g*0.1)}')# a1.geometry('宽x高+距离屏幕左侧多少+距离屏幕上方多少')# 设置窗口锁定缩放a1.resizable(width=True, height=False) # 默认True,可缩放# 设置窗口图标a1.iconbitmap('logo1.ico') # 可以传相对路径和绝对路径,建议相对路径# 开启窗口/主循环a1.mainloop()

(4)设置窗口背景颜色、设置窗口透明度
# 设置窗口背景颜色# 设置窗口透明度# https://tools.jb51.net/static/colorpicker/ 颜色表import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 获取用户分辨率a2 = a1.maxsize()k, g = a2# 设置窗口大小# 设置窗口打开位置a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}+{int(k*0.1)}+{int(g*0.1)}')# a1.geometry('宽x高+距离屏幕左侧多少+距离屏幕上方多少')# 设置窗口锁定缩放a1.resizable(width=True, height=True) # 默认True,可缩放# 设置窗口图标a1.iconbitmap('logo1.ico') # 可以传相对路径和绝对路径,建议相对路径# 设置窗口背景颜色 # 可以写颜色英文和颜色编码a1.configure(bg='#9999ff')# 设置窗口透明度 # 第一个位置传参,字符串'-alpha',后面是数字 0-1 之间a1.attributes('-alpha', 1)# 开启窗口/主循环a1.mainloop()

(5)设置窗口置顶、设置窗口关闭时执行的函数 WM_DELETE_WINDOW、销毁窗口\组件
# 设置窗口置顶# 设置窗口关闭时执行的函数 WM_DELETE_WINDOW# 销毁窗口\组件import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 获取用户分辨率a2 = a1.maxsize()k, g = a2# 设置窗口大小# 设置窗口打开位置a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}+{int(k*0.1)}+{int(g*0.1)}')# a1.geometry('宽x高+距离屏幕左侧多少+距离屏幕上方多少')# 设置窗口锁定缩放a1.resizable(width=True, height=True) # 默认True,可缩放# 设置窗口图标a1.iconbitmap('logo1.ico') # 可以传相对路径和绝对路径,建议相对路径# 设置窗口背景颜色 # 可以写颜色英文和颜色编码a1.configure(bg='#9999ff')# 设置窗口透明度 # 第一个位置传参,字符串'-alpha',后面是数字 0-1 之间a1.attributes('-alpha', 1)# 设置窗口置顶a1.attributes('-topmost', True)def guan():print('关闭窗口执行函数')# 销毁窗口a1.destroy()# 设置窗口关闭时执行的函数 WM_DELETE_WINDOWa1.protocol('WM_DELETE_WINDOW', guan)# 开启窗口/主循环a1.mainloop()

3
tkinter之Tk组件添加
(1)标签组件Label、填充布局pack()
# 标签组件 Label# 填充布局 pack()import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 获取用户分辨率a2 = a1.maxsize()k, g = a2# 设置窗口大小# 设置窗口打开位置a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}+{int(k*0.1)}+{int(g*0.1)}')# a1.geometry('宽x高+距离屏幕左侧多少+距离屏幕上方多少')# 设置窗口锁定缩放a1.resizable(width=True, height=True) # 默认True,可缩放# 设置窗口图标a1.iconbitmap('logo1.ico') # 可以传相对路径和绝对路径,建议相对路径# 设置窗口背景颜色 # 可以写颜色英文和颜色编码a1.configure(bg='#9999ff')# 设置窗口透明度 # 第一个位置传参,字符串'-alpha',后面是数字 0-1 之间a1.attributes('-alpha', 1)# 设置窗口置顶a1.attributes('-topmost', True)def guan():print('关闭窗口执行函数')# 销毁窗口a1.destroy()# 设置窗口关闭时执行的函数 WM_DELETE_WINDOWa1.protocol('WM_DELETE_WINDOW', guan)# 标签组件 Labela2 = tk.Label(a1, text='我的游戏集结', font=('黑体', 36), fg='red', bg='#000000')# 填充布局 pack()a2.pack()# 开启窗口/主循环a1.mainloop()

(2)填充布局 pack()、自定义布局 place()、网格布局 grid()
# 填充布局 pack()# 自定义布局 place()# 网格布局 grid()import tkinter as tk# 创建窗口a1 = tk.Tk()# 设置窗口标题a1.title('我的游戏')# 获取用户分辨率a2 = a1.maxsize()k, g = a2# 设置窗口大小# 设置窗口打开位置a1.geometry(f'{int(k*0.5)}x{int(g*0.5)}+{int(k*0.1)}+{int(g*0.1)}')# a1.geometry('宽x高+距离屏幕左侧多少+距离屏幕上方多少')# 设置窗口锁定缩放a1.resizable(width=True, height=True) # 默认True,可缩放# 设置窗口图标a1.iconbitmap('logo1.ico') # 可以传相对路径和绝对路径,建议相对路径# 设置窗口背景颜色 # 可以写颜色英文和颜色编码a1.configure(bg='#9999ff')# 设置窗口透明度 # 第一个位置传参,字符串'-alpha',后面是数字 0-1 之间a1.attributes('-alpha', 1)# 设置窗口置顶a1.attributes('-topmost', True)def guan():print('关闭窗口执行函数')# 销毁窗口a1.destroy()# 设置窗口关闭时执行的函数 WM_DELETE_WINDOWa1.protocol('WM_DELETE_WINDOW', guan)# 标签组件 Labela2 = tk.Label(a1, text='我的游戏集结', font=('黑体', 36), fg='red', bg='#000000')# 填充布局 pack()# a2.pack()# 自定义布局place()# a2.place(x=300, y=300) # 注意 不要超过窗口范围# 网格布局a2.grid(row=1, column=1) # 自动填充空白位置a2 = tk.Label(a1, text='我的游戏集结', font=('黑体', 36), fg='red', bg='#000000')a2.grid(row=20, column=1) # row:行;column:列# 开启窗口/主循环a1.mainloop()

(3)输入框组件 Entry、字符串变量 StringVar
# 输入框组件 Entry# 字符串变量 StringVarimport tkinter as tka1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+100+100')a1.resizable(width=True, height=True)a1.iconbitmap('logo1.ico')tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=100)tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=180)# 创建字符串变量s1 = tk.StringVar()# 当成提示文本s1.set('请输入账号')s2 = tk.StringVar()s2.set('请输入密码')# 输入框组件 Entrytk.Entry(a1, textvariable=s1, width=15, font=('黑体', 26)).place(x=150, y=100)tk.Entry(a1, textvariable=s2, width=15, font=('黑体', 26)).place(x=150, y=180)# 开启窗口/主循环a1.mainloop()

(4)按钮组件Button、字符串变量获取
# 按钮组件Button# 字符串变量获取import tkinter as tka1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+100+100')a1.resizable(width=True, height=True)a1.iconbitmap('logo1.ico')tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=100)tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=180)# 创建字符串变量s1 = tk.StringVar()# 当成提示文本s1.set('请输入账号')s2 = tk.StringVar()s2.set('请输入密码')# 输入框组件 Entrytk.Entry(a1, textvariable=s1, width=15, font=('黑体', 26)).place(x=150, y=100)tk.Entry(a1, textvariable=s2, width=15, font=('黑体', 26)).place(x=150, y=180)def d1():print('ooaac')# 字符串变量获取print(s1.get())print(s2.get())# 按钮组件tk.Button(a1, command=d1, text='登录', font=('黑体', 26), width=8).place(x=150, y=250)# 开启窗口/主循环a1.mainloop()

(5)四种弹窗组件 messagebox
# 四种弹窗组件 messageboximport tkinter as tkfrom tkinter import messageboxa1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+100+100')a1.resizable(width=True, height=True)a1.iconbitmap('logo1.ico')tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=100)tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=180)# 创建字符串变量s1 = tk.StringVar()# 当成提示文本s1.set('请输入账号')s2 = tk.StringVar()s2.set('请输入密码')# 输入框组件 Entrytk.Entry(a1, textvariable=s1, width=15, font=('黑体', 26)).place(x=150, y=100)tk.Entry(a1, textvariable=s2, width=15, font=('黑体', 26)).place(x=150, y=180)def d1():if s1.get() != '123'or s2.get() != '123':print('账号或密码错误')# messagebox.showerror('错误', '账号或密码错误')# messagebox.showinfo('错误', '账号或密码错误')# messagebox.showwarning('错误', '账号或密码错误')d2 = messagebox.askokcancel('错误', '账号或密码错误')if d2:print('点击了确定')else:print('点击了取消')else:messagebox.showinfo('成功', '登录成功')# 按钮组件tk.Button(a1, command=d1, text='登录', font=('黑体', 26), width=8).place(x=150, y=250)# 开启窗口/主循环a1.mainloop()



(6)顶层窗口 Toplevel()
# 顶层窗口 Toplevel()import tkinter as tkfrom tkinter import messageboxa1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+100+100')a1.resizable(width=True, height=True)a1.iconbitmap('logo1.ico')tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=100)tk.Label(a1, text='密码:', font=('黑体', 26)).place(x=50, y=180)# 创建字符串变量s1 = tk.StringVar()# 当成提示文本s1.set('请输入账号')s2 = tk.StringVar()s2.set('请输入密码')# 输入框组件 Entrytk.Entry(a1, textvariable=s1, width=15, font=('黑体', 26)).place(x=150, y=100)tk.Entry(a1, textvariable=s2, width=15, font=('黑体', 26)).place(x=150, y=180)def d1():if s1.get() != '123'or s2.get() != '123':print('账号或密码错误')# messagebox.showerror('错误', '账号或密码错误')# messagebox.showinfo('错误', '账号或密码错误')# messagebox.showwarning('错误', '账号或密码错误')d2 = messagebox.askokcancel('错误', '账号或密码错误')if d2:print('点击了确定')else:print('点击了取消')else:messagebox.showinfo('成功', '登录成功')def zc():a2 = tk.Toplevel()a2.title('注册页面')a2.geometry('400x400+100+100')a2.resizable(width=True, height=True)a2.iconbitmap('logo1.ico')tk.Label(a2, text='账号:', font=('黑体', 16)).grid(row=1, column=1)tk.Label(a2, text='密码:', font=('黑体', 16)).grid(row=2, column=1)tk.Entry(a2, width=10, font=('楷体', 20)).grid(row=1, column=2)tk.Entry(a2, width=10, font=('楷体', 20)).grid(row=2, column=2)tk.Button(a2, command='', text='注册', font=('楷体', 20)).place(x=100, y=100)# 按钮组件tk.Button(a1, command=d1, text='登录', font=('黑体', 26), width=8).place(x=100, y=250)tk.Button(a1, command=zc, text='注册', font=('黑体', 26), width=8).place(x=290, y=250)# 开启窗口/主循环a1.mainloop()

(7)完善注册页面
# 完善注册页面import tkinter as tkfrom tkinter import messageboxhao = {}a2 = Nonea1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+100+100')a1.resizable(width=True, height=True)a1.iconbitmap('logo1.ico')s1 = tk.StringVar()s1.set('请输入账号')s2 = tk.StringVar()s2.set('请输入密码')s3 = tk.StringVar()s3.set('请输入账号')s4 = tk.StringVar()s4.set('请输入密码')tk.Label(a1, text='账号:', font=('黑体', 26)).place(x=50, y=100)tk.Label(a1, text='密码:', font=('黑体', 26)).place(x=50, y=180)# 输入框组件 Entrytk.Entry(a1, textvariable=s1, width=15, font=('黑体', 26)).place(x=150, y=100)tk.Entry(a1, textvariable=s2, width=15, font=('黑体', 26)).place(x=150, y=180)def guan():d1 = messagebox.askokcancel('是否关闭', '确认关闭吗?')if d1:a1.destroy()else:passa1.protocol('WM_DELETE_WINDOW', guan)def d1():if s1.get() in hao:if s2.get() == hao[s1.get()]:messagebox.showinfo('成功', '登录成功')else:messagebox.showerror('错误', '密码不正确')else:messagebox.showerror('错误', '账号不存在')def zc2():global haoif s3.get() not in hao:hao[s3.get()] = s4.get()messagebox.showinfo('成功', '注册成功')print(hao)a2.destroy()else:messagebox.showerror('错误', '账号已存在')def zc():global a2a2 = tk.Toplevel()a2.title('注册页面')a2.geometry('400x400+100+100')a2.resizable(width=True, height=True)a2.iconbitmap('logo1.ico')tk.Label(a2, text='账号:', font=('黑体', 16)).grid(row=1, column=1)tk.Label(a2, text='密码:', font=('黑体', 16)).grid(row=2, column=1)tk.Entry(a2, textvariable=s3, width=10, font=('楷体', 20)).grid(row=1, column=2)tk.Entry(a2, textvariable=s4, width=10, font=('楷体', 20)).grid(row=2, column=2)tk.Button(a2, command=zc2, text='注册', font=('楷体', 20)).place(x=100, y=100)# 按钮组件tk.Button(a1, command=d1, text='登录', font=('黑体', 26), width=8).place(x=100, y=250)tk.Button(a1, command=zc, text='注册', font=('黑体', 26), width=8).place(x=290, y=250)# 开启窗口/主循环a1.mainloop()



4
tkinter之Tk菜单添加
(1)创建主菜单、设置菜单名、开启菜单栏
# 创建主菜单# 设置菜单名# 开启菜单栏import tkinter as tka1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+400+200')a1.resizable(True, True)a1.iconbitmap('logo1.ico')# 创建主菜单cai = tk.Menu(a1)# 设置菜单名cai.add_cascade(label='员工1')cai.add_cascade(label='员工2')# 开启菜单栏a1.config(menu=cai)a1.mainloop()

(2)创建下级菜单、设置下级菜单、绑定到主菜单
# 创建主菜单# 设置菜单名# 开启菜单栏import tkinter as tka1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+400+200')a1.resizable(True, True)a1.iconbitmap('logo1.ico')# 创建主菜单cai = tk.Menu(a1)# 创建下级菜单xia = tk.Menu(cai, tearoff=0)# 设置下级菜单xia.add_command(label='添加', command='')# 绑定到主菜单# 设置菜单名cai.add_cascade(label='员工1', menu=xia) # menu=xia下级菜单绑定到主菜单cai.add_cascade(label='员工2')# 开启菜单栏a1.config(menu=cai)a1.mainloop()

(3)创建下拉列表(组合框)、导包:from tkinter.ttk import Combobox
# 创建下拉列表(组合框)# 导包:from tkinter.ttk import Comboboximport tkinter as tkfrom tkinter.ttk import Comboboxa1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+400+200')a1.resizable(True, True)a1.iconbitmap('logo1.ico')def t():t1 = tk.Toplevel()t1.title('我的游戏')t1.geometry('300x300+500+300')t1.resizable(True, True)t1.iconbitmap('logo1.ico')tk.Label(t1, text='城市:', font=('楷体', 16)).grid(row=1, column=1)t2 = tk.StringVar()t3 = ['北京', '上海', '深圳', '广州']# 创建下拉列表(组合框)t4 = Combobox(t1, state='readon+ly', width=15, textvariable=t2, values=t3, font=('楷体', 16))t4.grid(row=1, column=2)# 创建主菜单cai = tk.Menu(a1)# 创建下级菜单xia = tk.Menu(cai, tearoff=0)# 设置下级菜单xia.add_command(label='添加', command=t)# 绑定到主菜单# 设置菜单名cai.add_cascade(label='员工1', menu=xia) # menu=xia下级菜单绑定到主菜单cai.add_cascade(label='员工2')# 开启菜单栏a1.config(menu=cai)a1.mainloop()

(4)创建单选框、顶层窗口焦点
# 创建单选框# 顶层窗口焦点import tkinter as tkfrom tkinter.ttk import Comboboxa1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+400+200')a1.resizable(True, True)a1.iconbitmap('logo1.ico')def t():t1 = tk.Toplevel()t1.title('我的游戏')t1.geometry('300x300+500+300')t1.resizable(True, True)t1.iconbitmap('logo1.ico')# 设置顶层窗口焦点t1.focus_set()tk.Label(t1, text='城市:', font=('楷体', 16)).grid(row=1, column=1)tk.Label(t1, text='性别:', font=('楷体', 16)).grid(row=1, column=1)t2 = tk.StringVar()s2 = tk.StringVar(value='男')t3 = ['北京', '上海', '深圳', '广州']# 创建下拉列表(组合框)t4 = Combobox(t1, state='readonly', width=15, textvariable=t2, values=t3, font=('楷体', 12))# 设置下拉列表组件默认显示列表内哪个下标索引t4.current(0)t4.grid(row=1, column=2)# 创建单选框tk.Radiobutton(t1, font=('楷体', 16), text='男', variable=s2, value='男').place(x=80, y=30)tk.Radiobutton(t1, font=('楷体', 16), text='女', variable=s2, value='女').place(x=130, y=30)def tj():print(t2.get())print(s2.get())tk.Button(t1, text='提交', command=tj).place(x=200, y=200)# 创建主菜单cai = tk.Menu(a1)# 创建下级菜单xia = tk.Menu(cai, tearoff=0)# 设置下级菜单xia.add_command(label='添加', command=t)# 绑定到主菜单# 设置菜单名cai.add_cascade(label='员工1', menu=xia) # menu=xia下级菜单绑定到主菜单cai.add_cascade(label='员工2')# 开启菜单栏a1.config(menu=cai)a1.mainloop()


(5)创建多选框 Checkbutton、创建整数变量 IntVar()
# 创建多选框 Checkbutton# 创建整数变量 IntVar()import tkinter as tkfrom tkinter.ttk import Comboboxa1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+400+200')a1.resizable(True, True)a1.iconbitmap('logo1.ico')def t():t1 = tk.Toplevel()t1.title('我的游戏')t1.geometry('300x300+500+300')t1.resizable(True, True)t1.iconbitmap('logo1.ico')# 设置顶层窗口焦点t1.focus_set()tk.Label(t1, text='城市:', font=('楷体', 16)).grid(row=1, column=1)tk.Label(t1, text='性别:', font=('楷体', 16)).grid(row=2, column=1)tk.Label(t1, text='爱好:', font=('楷体', 16)).grid(row=3, column=1)t2 = tk.StringVar()s2 = tk.StringVar(value='男')# 创建整数变量s3 = tk.IntVar()s4 = tk.IntVar()t3 = ['北京', '上海', '深圳', '广州']# 创建下拉列表(组合框)t4 = Combobox(t1, state='readonly', width=15, textvariable=t2, values=t3, font=('楷体', 12))# 设置下拉列表组件默认显示列表内哪个下标索引t4.current(0)t4.grid(row=1, column=2)# 创建单选框tk.Radiobutton(t1, font=('楷体', 16), text='男', variable=s2, value='男').place(x=80, y=30)tk.Radiobutton(t1, font=('楷体', 16), text='女', variable=s2, value='女').place(x=130, y=30)# 创建多选框tk.Checkbutton(t1, font=('楷体', 12), text='跑步', variable=s3, onvalue=1, offvalue=0).place(x=80, y=57)tk.Checkbutton(t1, font=('楷体', 12), text='跑步', variable=s4, onvalue=1, offvalue=0).place(x=150, y=57)def tj():print(t2.get())print(s2.get())if s3.get() == 1:print('跑步')else:print('未选择')if s4.get() == 1:print('游泳')else:print('未选择')tk.Button(t1, text='提交', command=tj).place(x=120, y=100)# 创建主菜单cai = tk.Menu(a1)# 创建下级菜单xia = tk.Menu(cai, tearoff=0)# 设置下级菜单xia.add_command(label='添加', command=t)# 绑定到主菜单# 设置菜单名cai.add_cascade(label='员工1', menu=xia) # menu=xia下级菜单绑定到主菜单cai.add_cascade(label='员工2')# 开启菜单栏a1.config(menu=cai)a1.mainloop()


(6)创建列表框Listbox、导包:from tkinter import END
# 创建列表框Listbox# 导包:from tkinter import ENDimport tkinter as tkfrom tkinter.ttk import Comboboxfrom tkinter import ENDa1 = tk.Tk()a1.title('我的游戏')a1.geometry('500x500+400+200')a1.resizable(True, True)a1.iconbitmap('logo1.ico')tk.Label(a1, font=('楷体', 16), text='员工列表:', fg='red').place(x=1, y=1)lb = tk.Listbox(a1, font=('楷体', 16), width=44, height=20)lb.place(x=4, y=30)def t():t1 = tk.Toplevel()t1.title('我的游戏')t1.geometry('300x300+500+300')t1.resizable(True, True)t1.iconbitmap('logo1.ico')# 设置顶层窗口焦点t1.focus_set()tk.Label(t1, text='城市:', font=('楷体', 16)).grid(row=1, column=1)tk.Label(t1, text='性别:', font=('楷体', 16)).grid(row=2, column=1)tk.Label(t1, text='爱好:', font=('楷体', 16)).grid(row=3, column=1)t2 = tk.StringVar()s2 = tk.StringVar(value='男')# 创建整数变量s3 = tk.IntVar()s4 = tk.IntVar()t3 = ['北京', '上海', '深圳', '广州']# 创建下拉列表(组合框)t4 = Combobox(t1, state='readonly', width=15, textvariable=t2, values=t3, font=('楷体', 12))# 设置下拉列表组件默认显示列表内哪个下标索引t4.current(0)t4.grid(row=1, column=2)# 创建单选框tk.Radiobutton(t1, font=('楷体', 16), text='男', variable=s2, value='男').place(x=80, y=30)tk.Radiobutton(t1, font=('楷体', 16), text='女', variable=s2, value='女').place(x=130, y=30)# 创建多选框tk.Checkbutton(t1, font=('楷体', 12), text='跑步', variable=s3, onvalue=1, offvalue=0).place(x=80, y=57)tk.Checkbutton(t1, font=('楷体', 12), text='跑步', variable=s4, onvalue=1, offvalue=0).place(x=150, y=57)def tj():print(t2.get())print(s2.get())if s3.get() == 1:ah1 = '跑步'else:ah1 = '未选择'if s4.get() == 1:ah2 = '游泳'else:ah2 = '未选择'nei = f'城市:{t2.get()}, 性别:{s2.get()}, 爱好1:{ah1}, 爱好2:{ah2}'# 追加列表框内容lb.insert(END, nei)tk.Button(t1, text='提交', command=tj).place(x=120, y=100)# 创建主菜单cai = tk.Menu(a1)# 创建下级菜单xia = tk.Menu(cai, tearoff=0)# 设置下级菜单xia.add_command(label='添加', command=t)# 绑定到主菜单# 设置菜单名cai.add_cascade(label='员工1', menu=xia) # menu=xia下级菜单绑定到主菜单cai.add_cascade(label='员工2')# 开启菜单栏a1.config(menu=cai)a1.mainloop()

夜雨聆风