想用Python快速制作一个带按钮、输入框和标签的软件界面,却不知从何下手组装这些可视化控件?
TKinter让你能像搭积木一样,用简洁的代码将这些组件拖入窗口,并自由布局。
# 标签组件 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()
# 按钮组件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()
# 四种弹窗组件 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()
# 顶层窗口 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()
# 完善注册页面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 hao if s3.get() not in hao: hao[s3.get()] = s4.get() messagebox.showinfo('成功', '注册成功') print(hao) a2.destroy() else: messagebox.showerror('错误', '账号已存在')def zc(): global a2 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, 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()