Tkinter - Python图形界面开发指南

作者:唐叔在学习
专栏:唐叔学python
标签:Python GUI编程 Tkinter教程 图形界面开发 Python实战 界面设计 事件监听 Python入门 唐叔Python 编程学习 软件开发

文章目录

    • 一、Tkinter是什么?为什么选择它?
    • 二、Tkinter基础组件详解
      • 2.1 标签(Label)和按钮(Button) - 界面基础
      • 2.2 输入框(Entry)和文本框(Text) - 用户输入处理
    • 三、Tkinter高级组件精讲
      • 3.1 单选按钮(Radiobutton)和复选框(Checkbutton)
      • 3.2 列表框(Listbox) - 数据展示利器
      • 3.3 尺度(Scale)和画布(Canvas) - 交互式组件
      • 3.4 菜单(Menu) - 打造专业级应用界面
        • 3.4.1 基础菜单实现
        • 3.4.2 右键上下文菜单
      • 3.5 弹窗(Messagebox) - 用户交互必备
        • 3.5.1 常见弹窗类型
        • 3.5.2 自定义弹窗
      • 3.6 框架(Frame) - 界面布局神器
        • 3.6.1 基础Frame使用
        • 3.6.2 嵌套Frame实现复杂布局
    • 四、Tkinter布局与事件处理
      • 4.1 三大布局管理器对比
      • 4.2 常见事件监听
    • 五、综合案例:带菜单的文本编辑器
    • 六、总结与思维导图

一、Tkinter是什么?为什么选择它?

各位小伙伴们好,我是唐叔!今天咱们来聊聊Python中一个超级实用的库——Tkinter。作为Python标准库中的GUI工具包,Tkinter可以说是Python图形界面开发的"瑞士军刀"!

为什么我推荐大家学习Tkinter呢?原因很简单:

  1. 内置标准库:无需额外安装,Python自带
  2. 跨平台:Windows、Mac、Linux通吃
  3. 简单易学:比PyQt、wxPython等更轻量
  4. 快速原型开发:小工具开发效率极高
import tkinter as tk
root = tk.Tk()
root.title("唐叔的Tkinter教程")
root.mainloop()

在这里插入图片描述

这三行代码就能创建一个窗口,是不是很简单?接下来,唐叔就带大家深入探索Tkinter的奥秘!

二、Tkinter基础组件详解

2.1 标签(Label)和按钮(Button) - 界面基础

Label是显示文本或图像的组件,Button则是交互的起点,我们先来看个例子:

import tkinter as tkdef say_hello():label.config(text="你好,Tkinter!")root = tk.Tk()
label = tk.Label(root, text="欢迎来到唐叔的教程", font=('Arial', 12))
button = tk.Button(root, text="点击我", command=say_hello)label.pack()
button.pack()
root.mainloop()

在这里插入图片描述

这里我们创建了一个标签和一个按钮,点击按钮会改变标签文本。pack()是布局管理器,后面唐叔会专门讲解。

2.2 输入框(Entry)和文本框(Text) - 用户输入处理

Entry是单行输入框,Text是多行文本框,非常适合表单类应用:

import tkinter as tkdef show_text():content = entry.get()text.insert(tk.END, f"\n你输入了:{content}")root = tk.Tk()
entry = tk.Entry(root, width=30)
text = tk.Text(root, height=5)
button = tk.Button(root, text="显示", command=show_text)entry.pack()
button.pack()
text.pack()
root.mainloop()

在这里插入图片描述

三、Tkinter高级组件精讲

3.1 单选按钮(Radiobutton)和复选框(Checkbutton)

Radiobutton用于单选,Checkbutton用于多选:

import tkinter as tkdef show_choice():tk.Label(root, text=f"性别:{gender.get()}").pack()tk.Label(root, text=f"爱好:{', '.join([h for h, v in hobbies.items() if v.get()])}").pack()root = tk.Tk()# 单选按钮
gender = tk.StringVar()
tk.Label(root, text="性别:").pack()
tk.Radiobutton(root, text="男", variable=gender, value="男").pack()
tk.Radiobutton(root, text="女", variable=gender, value="女").pack()# 复选框
hobbies = {"音乐": tk.BooleanVar(),"运动": tk.BooleanVar(),"阅读": tk.BooleanVar()
}
tk.Label(root, text="爱好:").pack()
for text, var in hobbies.items():tk.Checkbutton(root, text=text, variable=var).pack()tk.Button(root, text="提交", command=show_choice).pack()
root.mainloop()

在这里插入图片描述

3.2 列表框(Listbox) - 数据展示利器

Listbox可以显示项目列表,支持单选或多选:

import tkinter as tkdef show_selection():selection = listbox.curselection()label.config(text=f"\n你选中了:{', '.join([listbox.get(h) for h in selection])}")root = tk.Tk()
listbox = tk.Listbox(root, selectmode=tk.MULTIPLE)
for item in ["Python", "Java", "C++", "JavaScript"]:listbox.insert(tk.END, item)
button = tk.Button(root, text="显示选中", command=show_selection)
label = tk.Label(root)listbox.pack()
button.pack()
label.pack()
root.mainloop()

在这里插入图片描述

3.3 尺度(Scale)和画布(Canvas) - 交互式组件

Scale是滑块组件,Canvas则是绘图区域:

import tkinter as tkdef update_color(_):r = red_scale.get()g = green_scale.get()b = blue_scale.get()color = f"#{r:02x}{g:02x}{b:02x}"canvas.config(bg=color)hex_label.config(text=color)root = tk.Tk()red_scale = tk.Scale(root, from_=0, to=255, orient=tk.HORIZONTAL, command=update_color)
green_scale = tk.Scale(root, from_=0, to=255, orient=tk.HORIZONTAL, command=update_color)
blue_scale = tk.Scale(root, from_=0, to=255, orient=tk.HORIZONTAL, command=update_color)canvas = tk.Canvas(root, width=200, height=100, bg="#000000")
hex_label = tk.Label(root, text="#000000")red_scale.pack()
green_scale.pack()
blue_scale.pack()
canvas.pack()
hex_label.pack()
root.mainloop()

在这里插入图片描述

3.4 菜单(Menu) - 打造专业级应用界面

菜单是桌面应用的标配,Tkinter的Menu组件可以轻松实现多级菜单功能。

3.4.1 基础菜单实现
import tkinter as tkdef new_file():print("新建文件")def about():tk.messagebox.showinfo("关于", "唐叔的Tkinter教程\n版本1.0")root = tk.Tk()
root.title("菜单演示")# 创建主菜单栏
menubar = tk.Menu(root)# 文件菜单
filemenu = tk.Menu(menubar, tearoff=0)
filemenu.add_command(label="新建", command=new_file)
filemenu.add_command(label="打开")
filemenu.add_separator()  # 分隔线
filemenu.add_command(label="退出", command=root.quit)
menubar.add_cascade(label="文件", menu=filemenu)# 帮助菜单
helpmenu = tk.Menu(menubar, tearoff=0)
helpmenu.add_command(label="帮助主题")
helpmenu.add_command(label="关于", command=about)
menubar.add_cascade(label="帮助", menu=helpmenu)# 配置菜单栏
root.config(menu=menubar)root.mainloop()

在这里插入图片描述

关键点说明

  • tearoff=0 禁用菜单可撕下功能
  • add_separator() 添加菜单分隔线
  • add_cascade() 创建子菜单
3.4.2 右键上下文菜单
import tkinter as tkdef popup(event):context_menu.post(event.x_root, event.y_root)root = tk.Tk()
context_menu = tk.Menu(root, tearoff=0)
context_menu.add_command(label="复制")
context_menu.add_command(label="粘贴")
context_menu.add_separator()
context_menu.add_command(label="自定义操作")root.bind("<Button-3>", popup)  # 右键绑定
root.mainloop()

在这里插入图片描述

3.5 弹窗(Messagebox) - 用户交互必备

弹窗是与用户交互的重要方式,Tkinter提供了多种预定义弹窗:

3.5.1 常见弹窗类型
from tkinter import messagebox# 信息提示框
messagebox.showinfo("提示", "操作成功完成!")# 警告框
messagebox.showwarning("警告", "磁盘空间不足")# 错误框
messagebox.showerror("错误", "文件打开失败")# 询问框
result = messagebox.askquestion("确认", "确定要删除吗?")
if result == 'yes':print("用户选择了确定")# 是/否选择框
result = messagebox.askyesno("选择", "是否继续?")# 重试/取消框
result = messagebox.askretrycancel("重试", "连接失败,是否重试?")

在这里插入图片描述

3.5.2 自定义弹窗
import tkinter as tkdef custom_dialog():dialog = tk.Toplevel()dialog.title("自定义对话框")tk.Label(dialog, text="请输入内容:").pack()entry = tk.Entry(dialog)entry.pack()def on_ok():print("输入内容:", entry.get())dialog.destroy()tk.Button(dialog, text="确定", command=on_ok).pack()root = tk.Tk()
tk.Button(root, text="打开对话框", command=custom_dialog).pack()
root.mainloop()

在这里插入图片描述

3.6 框架(Frame) - 界面布局神器

Frame是组织复杂界面的容器组件,相当于HTML中的<div>标签。

3.6.1 基础Frame使用
import tkinter as tkroot = tk.Tk()# 创建左侧框架
left_frame = tk.Frame(root, borderwidth=2, relief="groove")
tk.Label(left_frame, text="左侧面板").pack()
tk.Button(left_frame, text="按钮1").pack(pady=5)
tk.Button(left_frame, text="按钮2").pack(pady=5)
left_frame.pack(side="left", padx=10, pady=10, fill="y")# 创建右侧框架
right_frame = tk.Frame(root)
tk.Label(right_frame, text="右侧面板").grid(row=0, column=0, columnspan=2)
tk.Entry(right_frame).grid(row=1, column=0, pady=5)
tk.Button(right_frame, text="搜索").grid(row=1, column=1, padx=5)
right_frame.pack(side="right", padx=10, pady=10)root.mainloop()

在这里插入图片描述

3.6.2 嵌套Frame实现复杂布局
import tkinter as tkroot = tk.Tk()# 顶部工具栏
toolbar = tk.Frame(root, bg="#eee", height=40)
toolbar.pack(fill="x", padx=2, pady=2)
tk.Button(toolbar, text="文件").pack(side="left", padx=5)
tk.Button(toolbar, text="编辑").pack(side="left")# 主内容区
main_area = tk.Frame(root)
main_area.pack(fill="both", expand=True)# 左侧导航
nav_frame = tk.Frame(main_area, width=150, bg="#f0f0f0")
nav_frame.pack(side="left", fill="y")
tk.Label(nav_frame, text="导航菜单", bg="#ddd").pack(fill="x")
for item in ["首页", "设置", "帮助"]:tk.Button(nav_frame, text=item).pack(fill="x", pady=2)# 右侧内容
content_frame = tk.Frame(main_area)
content_frame.pack(side="right", fill="both", expand=True)
tk.Label(content_frame, text="主内容区").pack()
tk.Text(content_frame).pack(fill="both", expand=True)root.mainloop()

在这里插入图片描述

四、Tkinter布局与事件处理

4.1 三大布局管理器对比

  1. pack():简单自动布局
  2. grid():表格形式布局
  3. place():精确坐标布局
import tkinter as tk
# grid布局示例
root = tk.Tk()
tk.Label(root, text="用户名:").grid(row=0, column=0)
tk.Entry(root).grid(row=0, column=1)
tk.Label(root, text="密码:").grid(row=1, column=0)
tk.Entry(root, show="*").grid(row=1, column=1)
tk.Button(root, text="登录").grid(row=2, columnspan=2)
lumn=0)
tk.Entry(root, show="*").grid(row=1, column=1)
tk.Button(root, text="登录").grid(row=2, columnspan=2)
root.mainloop()

在这里插入图片描述

4.2 常见事件监听

Tkinter支持多种事件绑定方式:

def on_click(event):print(f"点击位置:({event.x}, {event.y})")root = tk.Tk()
button = tk.Button(root, text="测试事件")
button.bind("<Button-1>", on_click)  # 左键点击
button.pack()# 常见事件:
# <Button-1> 鼠标左键
# <Double-Button-1> 双击左键
# <KeyPress-A> A键按下
# <Motion> 鼠标移动

五、综合案例:带菜单的文本编辑器

import tkinter as tk
from tkinter import filedialogclass TextEditor:def __init__(self, root):self.root = rootself.setup_ui()def setup_ui(self):# 菜单栏menubar = tk.Menu(self.root)# 文件菜单filemenu = tk.Menu(menubar, tearoff=0)filemenu.add_command(label="新建", command=self.new_file)filemenu.add_command(label="打开", command=self.open_file)filemenu.add_command(label="保存", command=self.save_file)filemenu.add_separator()filemenu.add_command(label="退出", command=self.root.quit)menubar.add_cascade(label="文件", menu=filemenu)# 编辑菜单editmenu = tk.Menu(menubar, tearoff=0)editmenu.add_command(label="撤销")editmenu.add_command(label="重做")editmenu.add_separator()editmenu.add_command(label="剪切")editmenu.add_command(label="复制")editmenu.add_command(label="粘贴")menubar.add_cascade(label="编辑", menu=editmenu)self.root.config(menu=menubar)# 工具栏toolbar = tk.Frame(self.root, bd=1, relief=tk.RAISED)tk.Button(toolbar, text="打开", command=self.open_file).pack(side=tk.LEFT, padx=2)tk.Button(toolbar, text="保存", command=self.save_file).pack(side=tk.LEFT)toolbar.pack(side=tk.TOP, fill=tk.X)# 状态栏self.status = tk.StringVar()self.status.set("就绪")statusbar = tk.Label(self.root, textvariable=self.status, bd=1, relief=tk.SUNKEN, anchor=tk.W)statusbar.pack(side=tk.BOTTOM, fill=tk.X)# 文本编辑区self.text = tk.Text(self.root, wrap=tk.WORD)self.text.pack(expand=True, fill=tk.BOTH)def new_file(self):self.text.delete(1.0, tk.END)self.status.set("新建文件")def open_file(self):filepath = filedialog.askopenfilename()if filepath:with open(filepath, 'r') as f:self.text.delete(1.0, tk.END)self.text.insert(tk.END, f.read())self.status.set(f"已打开: {filepath}")def save_file(self):filepath = filedialog.asksaveasfilename()if filepath:with open(filepath, 'w') as f:f.write(self.text.get(1.0, tk.END))self.status.set(f"已保存: {filepath}")root = tk.Tk()
root.title("文本编辑器")
app = TextEditor(root)
root.mainloop()

在这里插入图片描述

六、总结与思维导图

通过本文,唐叔带大家系统学习了Tkinter的核心组件和事件处理机制。下面用一张思维导图总结关键知识点:

Tkinter知识体系
├── 基础组件
│   ├── Label - 文本/图像展示
│   ├── Button - 按钮交互
│   ├── Entry - 单行输入
│   └── Text - 多行文本
├── 高级组件
│   ├── Listbox - 列表展示
│   ├── Radiobutton - 单选
│   ├── Checkbutton - 多选
│   ├── Scale - 滑块
│   ├── Canvas - 绘图
│   ├── Menu - 菜单系统
│   │   ├── 主菜单栏
│   │   ├── 下拉菜单
│   │   └── 右键菜单
│   ├── Messagebox - 系统弹窗
│   │   ├── 提示框
│   │   ├── 警告框
│   │   └── 确认框
│   └── Frame - 布局容器
│       ├── 基础框架
│       └── 嵌套布局
├── 布局管理
│   ├── pack() - 自动布局
│   ├── grid() - 网格布局
│   └── place() - 绝对定位
└── 事件处理├── bind() - 事件绑定├── command - 按钮回调└── 常见事件类型

掌握了这些内容,你已经能够开发大多数简单的GUI应用了!Tkinter虽然不如一些专业GUI库强大,但对于快速开发小型工具来说绝对是利器。

唐叔小贴士:学习GUI编程最重要的是多实践,建议从模仿开始,逐步增加功能。遇到问题可以查阅官方文档或在CSDN社区提问交流。

如果觉得本文有帮助,别忘了点赞收藏哦!关注唐叔,获取更多Python实战教程!


下期预告:《Tkinter高级技巧:自定义样式与主题美化》,我们将学习如何让Tkinter界面更加美观专业!

往期Python精彩文章:

  • Pandas - JSON格式数据操作实践
  • Pandas - Python爬虫数据处理分析神器

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/90589.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/90589.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java基础day15

目录 一、Java集合简介 1.什么是集合&#xff1f; 2.集合接口 3.小结 二、List集合 1.List集合简介 三、ArrayList容器类 1.初始化 1.1无参初始化 1.2有参初始化 2.数据结构 3.常用方法 3.1增加元素 3.2查找元素 3.3 修改元素 3.4 删除元素 3.5 其他方法 4.扩…

React Three Fiber 实现昼夜循环:从光照过渡到日月联动的技术拆解

在 3D 场景中用 React Three Fiber 实现自然的昼夜循环&#xff0c;核心难点在于光照的平滑过渡、日月运动的联动逻辑、昼夜状态下的光影差异处理&#xff0c;以及性能与视觉效果的平衡。本文以一个 ReactThree.js 的实现为例&#xff0c;详细解析如何通过三角函数计算日月位置…

进阶向:基于Python的简易屏幕画笔工具

用Python打造你的专属屏幕画笔工具&#xff1a;零基础也能轻松实现你是否曾在观看网课或参加远程会议时&#xff0c;想要直接在屏幕上标注重点&#xff1f;或者作为设计师&#xff0c;需要快速绘制创意草图&#xff1f;现在&#xff0c;只需几行Python代码&#xff0c;你就能轻…

Elasticsearch-ik分析器

CLI 安装步骤 1、停止 Elasticsearch&#xff08;如果正在运行&#xff09;&#xff1a; 在安装插件之前&#xff0c;确保 Elasticsearch 没有在运行。 命令&#xff1a; systemctl stop elasticsearch2、安装插件&#xff1a; 使用 elasticsearch-plugin 命令安装 IK 插件。进…

MySQL八股篇

查询关键字执行先后顺序FROM&#xff08;及 JOIN)WHEREGROUP BYHAVINGSELECTDISTINCTORDER BYLIMIT / OFFSETCHAR 和 VARCHAR 的区别&#xff1f;使用场景&#xff1f;特性CHARVARCHAR​存储方式​​定长&#xff0c;存储时填充空格至定义长度变长&#xff0c;存储实际数据 长…

QT RCC 文件

RCC (Qt Resource Compiler) 是 Qt 框架中的一个工具&#xff0c;用于将资源文件&#xff08;如图像、音频、翻译文件等&#xff09;编译成二进制格式&#xff0c;并嵌入到应用程序可执行文件中。RCC 文件基本概念作用&#xff1a;将应用程序所需的资源文件编译成 C 代码&#…

数据湖典型架构解析:2025 年湖仓一体化解决方案

数据湖架构概述&#xff1a;从传统模型到 2025 年新范式数据湖作为存储海量异构数据的中央仓库&#xff0c;其架构设计直接影响企业数据价值的释放效率。传统数据湖架构主要关注数据的存储和管理&#xff0c;而 2025 年的数据湖架构已经演变为更加智能化、自动化的综合性数据平…

绘图库 Matplotlib Search

关于Pathon的绘图库的认识和基本操作的学习 这里学习了两款常用便捷的绘图库去学习使用Matplotlib介绍是最受欢迎的一种数据可视化包 是常用的2D绘图库 一般常于Numpy和Pandas使用 是数据分析中非常重要的工具可以自定义XY轴 绘制线形图 柱状图 直方图 密度图 散点图 更清晰的展…

Docker详解及实战

&#x1f389; Docker 简介和安装 - Docker 快速入门 Docker 简介 Docker是一个开源的平台&#xff0c;用于开发、交付和运行应用程序。它能够在Windows&#xff0c;macOS&#xff0c;Linux计算机上运行&#xff0c;并将某一应用程序及其依赖项打包至一个容器中&#xff0c;这…

嵌入式学习的第三十三天-进程间通信-UDP

一、网络1.定义不同主机间进程通信主机间在硬件层面互联互通主机在软件层面互联互通2.国际网络体系结构OSI模型&#xff08;7层&#xff09;: open system interconnect -------理论模型------定义了网络通信中不同层的协议1977 国际标准化组织各种不同体系结构的计算机能在世…

4、Spring AI_DeepSeek模型_结构化输出

一、前言 Spring AI 提供跨 AI 供应商&#xff08;如 OpenAI、Hugging Face 等&#xff09;的一致性 API, 通过分装的ChatModel或ChatClient即可轻松调动LLM进行流式或非流式对话。 本专栏主要围绕着通过OpenAI兼容接口调用各种大语言模型展开学习&#xff08;因为大部分模型…

Spring Data Redis 从入门到精通:原理与实战指南

一、Redis 基础概念 Redis&#xff08;Remote Dictionary Server&#xff09;是开源的内存键值对数据库&#xff0c;以高性能著称。它支持多种数据结构&#xff08;String、Hash、List、Set、ZSet&#xff09;&#xff0c;并提供持久化机制&#xff08;RDB、AOF&#xff09;。 …

免费版酒店押金原路退回系统——仙盟创梦IDE

项目介绍​东方仙盟开源酒店押金管理系统是一款面向中小型酒店、民宿、客栈的轻量级前台管理工具&#xff0c;专注于简化房态管理、订单处理和押金跟踪流程。作为完全开源的解决方案&#xff0c;它无需依赖任何第三方服务&#xff0c;所有数据存储在本地浏览器中&#xff0c;确…

10. isaacsim4.2教程-RTX Lidar 传感器

1. 前言RTX Lidar 传感器Isaac Sim的RTX或光线追踪Lidar支持通过JSON配置文件设置固态和旋转Lidar配置。每个RTX传感器必须附加到自己的视口或渲染产品&#xff0c;以确保正确模拟。重要提示&#xff1a; 在运行RTX Lidar仿真时&#xff0c;如果你在Isaac Sim UI中停靠窗口&…

QT6 源,七章对话框与多窗体(14)栈式窗体 QStackedWidget:本类里代码很少。举例,以及源代码带注释。

&#xff08;1&#xff09;这不是本章节要用到的窗体组件&#xff0c;只是跟着标签窗体 QTabWidget 一起学了。这也是 QT 的 UI 界面里的最后几个容器了。而且本类也很简单。就了解一下它。 本类的继承关系如下 &#xff1a; UI 设计界面 &#xff1a;运行效果 &#xff1a;&…

魔百和M401H_国科GK6323V100C_安卓9_不分地区免拆卡刷固件包

魔百和M401H_国科GK6323V100C_安卓9_不分地区免拆卡刷固件包刷机说明&#xff1a;1&#xff0c;进机顶盒设置&#xff08;密码10086&#xff09;&#xff0c;在其他里&#xff0c;一直按左键约32下&#xff0c;打开调试模式2&#xff0c;进网络设置&#xff0c;查看IP地址。3&a…

MySQL基础02

一. 函数在 MySQL 中&#xff0c;函数是用于对数据进行特定处理或计算的工具&#xff0c;根据作用范围和返回结果的不同&#xff0c;主要分为单行函数和聚合函数&#xff08;又称分组函数&#xff09;。以下是详细介绍&#xff1a;1.单行函数单行函数对每一行数据单独处理&…

LabVIEW 视觉检测SIM卡槽

针对SIM 卡槽生产中人工检测效率低、漏检误检率高的问题&#xff0c;设计了基于 LabVIEW 机器视觉的缺陷检测系统。该系统通过光学采集与图像处理算法&#xff0c;实现对卡槽引脚折弯、变形、漏铜等缺陷的自动检测&#xff0c;误报率为 0&#xff0c;平均检测时间小于 750ms&am…

RocketMQ5.3.1的安装

1、下载安装 RocketMQ 的安装包分为两种&#xff0c;二进制包和源码包。1 下载 Apache RocketMQ 5.3.1的源码包后上传到linux https://dist.apache.org/repos/dist/release/rocketmq/5.3.1/rocketmq-all-5.3.1-source-release.zip2 解压编译 $ unzip rocketmq-all-5.3.1-source…

FunASR实时多人对话语音识别、分析、端点检测

核心功能&#xff1a;FunASR是一个基础语音识别工具包&#xff0c;提供多种功能&#xff0c;包括语音识别&#xff08;ASR&#xff09;、语音端点检测&#xff08;VAD&#xff09;、标点恢复、语言模型、说话人验证、说话人分离和多人对话语音识别等。FunASR提供了便捷的脚本和…