天道酬勤,学无止境

[Python/Tkinter]How can I fetch the value of data which was set in function “event_generate”

I'm using Python 2.7.4 and new to Tkinter, and I'm stuck with the following code. I generated an event "test" and set the "data" option with a string, but an error occurred when retrieving it from event.

Error -> AttributeError: Event instance has no attribute 'data'

from Tkinter import *

def handle_it(event):
    # print "event handler"
    print event.data

root = Tk()
root.after(1, lambda: root.event_generate('<<test>>', data="hi there"))
root.bind('<<test>>', handle_it)
root.mainloop()

I can't find the related Python docs for this case, so I referred to the tcl document as below http://www.tcl.tk/man/tcl8.5/TkCmd/event.htm#M14

Does TKinter of Python 2.7 support "data" option? Thanks!

评论

No, unfortunately it doesn't. The Tcl interpreter recognizes it as a valid option, but it is one of the missing options that are not included in the Event class, like warp. You can take a look at the line 1188 of the Tkinter source code to see the rest of the missing options.

Tkinter does not handle properly the data field of event_generate.

Here is a snippet using private API of Tkinter (in fact Tcl...) that allows to read this field. This function only works with literals and I usually pass data a dictionary with literals.

from Tkinter import *

def handle_it(event):
    # print "event handler"
    print event.data

def bind_event_data(widget, sequence, func, add = None):
    def _substitute(*args):
        e = lambda: None #simplest object with __dict__
        e.data = eval(args[0])
        e.widget = widget
        return (e,)

    funcid = widget._register(func, _substitute, needcleanup=1)
    cmd = '{0}if {{"[{1} %d]" == "break"}} break\n'.format('+' if add else '', funcid)
    widget.tk.call('bind', widget._w, sequence, cmd)

root = Tk()

# unfortunately, does not work with my snippet (the data argument is eval-ed)
# you can adapt it to handle raw string.
root.after(100, lambda : root.event_generate('<<test>>', data="hi there"))
# works, but definitely looks too hacky
root.after(100, lambda : root.event_generate('<<test>>', data="'hi there'"))
# the way I typically use it
root.after(100, lambda : root.event_generate('<<test>>', data={"content": "hi there"}))

#should be:
#  root.bind('<<test>>', handle_it)
bind_event_data (root, '<<test>>', handle_it)

root.mainloop()

Note: there seems to be a race condition that prevent the event to be catched with a too small delay in after.

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • Python tkInter入门乐趣(Python tkInter Entry fun)
    问题 使用Python-tkInter-Entry小部件-当我使用validatecommand(如下)时,检查第一次在字符串> Max时发生,但是当我继续输入文本时,检查步骤-第一次之后没有删除或插入吗? 有什么建议吗? (除了不通过python构建桌面应用之外) #!/usr/bin/env python from Tkinter import * class MyEntry(Entry): def __init__(self, master, maxchars): Entry.__init__(self, master, validate = "key", validatecommand=self.validatecommand) self.MAX = maxchars def validatecommand(self, *args): if len(self.get()) >= self.MAX: self.delete(0,3) self.insert(0, "no") return True if __name__ == '__main__': tkmain = Tk() e = MyEntry(tkmain, 5) e.grid() tkmain.mainloop() 回答1 来自Tk男人:
  • Python tkinter -第三章 tkinter (窗口创建与Pack布局)
    第3章 tkinter 3.1 第一个tkinter程序 tkinter的程序很容易编写。难点是在后面的布局以及参数的传递。很多控件(Widget)的使用方法都可以从网络上快速的找到。 简单的tkinter窗口程序如下: import tkinter root = tkinter.Tk() root.mainloop() 结果: 只用三行程序就可以构建一个窗口程序,的确非常简单。不过这个程序没有大的用处。整个窗口也是空白的。我们会在后面的章节里面加入其他的控件,让这个窗口具有更多的功能。 详细解读一下上面的程序: (1)Import tkinter 是引入tkinter模块。所有的控件(Widget)都在里面有定义。 (2)root = tkinter.Tk() 是实例化Tk类。Tk类是顶层的控件类,完成窗口的一系列初始化。有兴趣的可以看tkinter类的__init__.py,看看Tk是如何完成初始化的。 (3)root.mainloop() 是主窗口循环。 3.2 窗口的基本属性 空白的窗口没有什么用处,这节会介绍一些关于窗口的基本属性与功能。 3.2.1 窗口标题 给窗口加一个标题,表明这个窗口是做什么的。一般都是显示程序的名称。或者动态的提示消息,比如打开的文件名称等。 添加标题的语句是: root.title('Hello') 把这条语句加在mainloop(
  • AIIC学习日记-python篇
    文章目录 python2020-2-25 anaconda+pycharm安装2020-2-25 numpy入门 2020-2-28 python环境变量设置、notepad++编辑器2020-2-28 notepad++编辑器、pycharm段注释 2020-2-29 python脚本编写Verilog文件2020-3-3 python科学制图2020-3-4 python入门class、import2020-3-4 python多线程2020-3-4 python界面-Tkinter2020-3-15 python常规操作以及对文件的读取处理常规操作 2020-3-17 python3D绘图安装Matplotlib操练 2020-3-18 python多个文件调用 中兴算法大赛2020-4-22 python join,split()2020-4-23 慢慢学数据结构咯2020-4-26 digraph画无向图2020-4-26 Python中的*使用2020-4-26 A*算法再学习 2020-4-27 继续学习2020-4-27 class继承2020-4-27 贪心算法+Qlearning 2020-4-29 搬运class和文本处理代码合并,debug2020-4-30 车厢载重考虑2020-5-1 多个测试用例的验证、bat批处理2020-5-2 调bug2020-5
  • 分享最全Python之tkinter—GUI(图形用户界面)文档!!!(未完成持续更新ing)
    基于tkinter的GUI界面编程 文章目录 基于tkinter的GUI界面编程 1.1GUI简介 1.2 tkinter库 1.3 tkinter 简介 1.4 导入tkinter库 1.4 创建图形用户界面步骤 2.1 tkinter 库中的组件 2.2 布局组件 3.1 常用组件 3.2 标签组件 3.3 文本框组件 3.4 菜单栏组件 3.4 选择性组件 4.1 时间处理机制 4.1.1 什么是事件 1.常用的键盘和鼠标事件 2.常用的窗口事件 1.1GUI简介 图形用户界面(Graphical User Interface, GUI, 又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。 图形用户界面是一种人与计算机通信的界面显示格式,允许用户使用鼠标等输入设备操纵屏幕上的图标或菜单选项,以选择命令、调用文件、启动程序或执行其他一一些日常任务。与通过键盘输入文本或字符命令来完成例行任务的字符界面相比,图形用户界面有许多优点。图形用户界面由窗口、下拉菜单、对话框及其相应的控制机制构成,在各种新式应用程序中都是标准化的,即相同的操作总是以同样的方式来完成,在图形用户界面,用户看到和操作的都是图形对象。 1.2 tkinter库 (1) tkinter:tkinter 模块(tk 接口)是Python的标准tkGUl工具包的接口。tk
  • 用 python+tkinter+有道云API 写一个自用的背单词软件
    目录 导语 程序功能 需要用的工具 需要安装的python包 程序代码 功能类函数Functions 键盘响应 窗体设置 Sql连接 Gui程序打包 结语 参考文献 导语 最近在学英语,新单词需要反复背,所以就想写一个可以自己存储单词的应用。在开始写之前搜索了一下有没有人已经做好了,只查到一篇文章有比较相关的思路,但是功能只有随机抽取单词,以及需要从外部构建好CSV表格导入进去,不够方便,所以得自己写了。刚好tkinter也一直没有学过,就趁这次的机会边学边写。 程序功能 程序主要分为三个功能区,分别是: Search模块:用于检索词库中的单词 Upload模块:用于向词库加入新单词 Next模块:用于背单词,由Next和Answer两个按键共同实现 最后呈现的功能如图所示: 需要用的工具 python 3.6 postgreSQL(用于存储词库,也可以用excel,但是响应速度慢,个人不建议) 需要安装的python包 tkinter:构建python中的Gui窗体 sqlalchemy:用于sql的连接 playsound:播放单词发音 urllib.request:从有道的API接口获取单词发音 pyinstaller:将py文件打包成exe 程序代码 程序的整体结构如图所示 功能类函数Functions 类Functions 是程序的功能集合,由Add_Words(新增单词
  • 如何在Python Tkinter中创建按钮以将整数变量增加1并显示该变量?(How do I create a button in Python Tkinter to increase integer variable by 1 and display that variable?)
    问题 我正在尝试创建一个Tkinter程序,该程序将存储一个int变量,并在每次单击按钮时将该int变量增加1,然后显示该变量,以便可以看到它以0开始,然后每次单击按钮上升1。我正在使用python 3.4。 import sys import math from tkinter import * root = Tk() root.geometry("200x200") root.title("My Button Increaser") counter = 0 def nClick(): counter + 1 def main_click(): mLabel = Label(root, text = nClick).pack() mButton1 = Button(text = "Increase", command = main_click, fg = "dark green", bg = "white").pack() root.mainloop() 回答1 您可以使用Tkinter变量。 当您需要修改其他小部件可能与之交互的数据时,它们特别有用。 这是与问题中的代码相似的代码,但不是将counter定义为普通变量,而是Tkinter的变量。 import tkinter import sys root = tkinter.Tk() root.geometry(
  • python tkinter canvas_python – Tkinter Canvas create_window()
    我正在尝试使用Tkinter Canvas(self._canvas)来使用create_window函数创建窗口.该函数的窗口字段是Tkinter Frame(self._tableFrame).有人可以帮我解决一下如何让self._tableFrame自动扩展到self._canvas的大小(即使用户改变了窗口大小)? 码: from Tkinter import Scrollbar as tkScrollBar from Tkinter import Frame as tkFrame from Tkinter import Canvas as tkCanvas from Tkinter import Entry as tkEntry from Tkinter import StringVar as tkStringVar from Tkinter import Tk, HORIZONTAL, N, S, E, W, RIGHT, LEFT, BOTTOM, X, Y, BOTH from Tkinter import TOP class Widget(tkFrame): def __init__(self, master=None): tkFrame.__init__(self, master) self._str = tkStringVar() self._widget =
  • 在python tkinter中处理异常(Handling exception in python tkinter)
    问题 我已经用Python Tkinter编写了一个应用程序。 我最近注意到,对于其中一项操作,如果该操作失败,它有时会关闭(不给出任何错误)。 我写了一个小程序来说明这个问题: import os from Tkinter import * def copydir(): src = "D:\\a\\x\\y" dest = "D:\\a\\x\\z" os.rename(src,dest) master = Tk() def callback(): global master master.after(1, callback) copydir() print "click!" b = Button(master, text="OK", command=copydir) b.pack() master.after(100, callback) mainloop() 要重现该问题,请打开将在“ ms命令提示符”中重命名的文件夹,以便重命名该文件夹将引发Tkinter代码中的异常。 我的原始代码正在使用线程并且还执行其他任务,因此我尝试使该测试脚本中的操作尽可能相似。 现在,如果我通过双击运行此代码,则程序将仅关闭而不会引发任何错误。 但是,如果我一直在从控制台运行此脚本,则异常消息将转储到控制台,并且至少我知道,这是错误的。 我可以通过在尝试重命名的代码中使用try /
  • Python tkinter -- 第18章 画布控件之线段(line)
    **18.2.17 create_line(coords, options) 根据 coords 给定的坐标,在画布上创建一条或多条线段。 如果给定的坐标超过两个点,则会首尾相连变成一条折线。 #直线 import tkinter as tk root=tk.Tk() root.geometry('320x240') b1=tk.Canvas(root) b1.create_line(50,50,100,100,width=5) b1.pack() root.mainloop() #折线 import tkinter as tk root=tk.Tk() root.geometry('320x240') b1=tk.Canvas(root) b1.create_line(50,50,100,100,150,50,width=5) b1.pack() root.mainloop() 结果: 说明:只输入2个点的坐标,create_line()绘制的是线段,而超过两个点的坐标,绘制的就是折线。 (1)coords:指定坐标。可以是多组坐标。 (2)options 选项的具体含义: 选项含义activedash当鼠标经过线段对象时候,绘制虚线activefill当鼠标经过线段对象时候,线段显示的颜色activestipple当鼠标经过线段对象时候
  • Python Tkinter Autocomplete combobox with LIKE search?
    I am trying to populate a Tkinter combobox with pre-defined values to select from. It is populating and I am able to type in and get suggestions. However, in order to do this I have to definitely know the first few characters. If I know some text in the middle or end of the string, its of no use because the combobox does only a 'LIKE%' search and not a '%LIKE%' search. Expected Output (Typing the word "Ceramic" fetches all names containing the string. Note: This is not a Tkinter screenshot): This is my adaptation of the code till now, if anyone can suggest how to modify the
  • Python tkinter -- 第18章 画布控件之位图(bitmap)
    18.2.15 create_bitmap(position, **options) 在画布的指定位置创建一个位图。 (1)position:位图的坐标(x,y)。 (2)**options:选项有: 选项含义activebackground指定当位图对象状态为 ACTIVE 时候的背景颜色activebitmap指定当位图对象状态为 ACTIVE 时候填充的位图activeforeground指定当位图对象状态为 ACTIVE 时候的前景颜色anchor1. 指定位图在 position 参数的相对位置2. N, NE, E, SE, S, SW, W, NW, 或 CENTER 来定位(EWSN代表东西南北,上北下南左西右东)3. 默认值是 CENTERbackground1. 指定背景颜色2. 即在位图中值为 0 的点的颜色3. 空字符串表示透明bitmap指定显示的位图disabledbackground指定当位图对象状态为 DISABLED 时候的背景颜色disabledbitmap指定当位图对象状态为 DISABLED 时候填充的位图disabledforeground指定当位图对象状态为 DISABLED 时候的前景颜色foreground1. 指定前景颜色2. 即在位图中值为 1 的点的颜色state1. 指定该画布对象的状态2. 可以是 NORMAL
  • 在Python线程中使用Intvar / DoubleVar是否安全?(Is it safe to use a Intvar/DoubleVar in a Python thread?)
    问题 首先,我要说一下,我无疑将为我的程序使用一个Queue 。 我花了相当多的时间研究这个话题而没有找到任何明确的答案之后,才或多或少地满足了我的好奇心。 所以,问题是:从主循环以外的任何地方访问/编辑IntVar() , DoubleVar()等是否安全? 另外,从一个单独的线程中简单地读取值(通过x.get() )怎么样? 我知道不应该从单独的线程编辑/更新窗口小部件,但是我没有找到有关Intvars等的信息。 任何见识将不胜感激。 这是一个相关的(但相当古老)的问题,但从未真正得到回答: Python / Tkinter:Tkinter StringVar(IntVar等)线程安全吗? 回答1 基于在对源代码注释_tkinter模块,好像Tkinter的实际至少打算是线程安全的,只要Tcl的与内置--enable-threads选项。 这得到了Python跟踪器(issue11077)上已解决的错误的支持,该错误指出tkinter不是线程安全的,最终确定tkinter的所有线程安全问题都是已在Python 2.7.3+中修复的错误。 这是_tkinter模块的来源针对此问题说的话: Tcl解释器仅在创建它的线程中有效,并且所有Tk活动也必须在该线程中发生。 这意味着必须在创建解释器的线程中调用mainloop。 可以从其他线程调用命令;
  • python tkinter树获取选定的项目值(python tkinter tree get selected item values)
    问题 我只是从 python 3.4 中的一个小的 tkinter 树程序开始。 我一直坚持返回所选行的第一个值。 我有4列的多行,并且在项目上单击鼠标左键时会调用一个函数: tree.bind('<Button-1>', selectItem) 功能: def selectItem(a): curItem = tree.focus() print(curItem, a) 这给了我这样的东西: I003 <tkinter.Event object at 0x0179D130> 看起来已正确识别了所选项目。 我现在需要的只是如何获取行中的第一个值。 树创建: from tkinter import * from tkinter import ttk def selectItem(): pass root = Tk() tree = ttk.Treeview(root, columns=("size", "modified")) tree["columns"] = ("date", "time", "loc") tree.column("date", width=65) tree.column("time", width=40) tree.column("loc", width=100) tree.heading("date", text="Date") tree.heading(
  • python2利用TKinter生成投影界面工具
    python中图形用户界面开发库的选择 图形用户界面(Graphical User Interface,简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面。在微信读书中搜索python gui,可以得到很多图形用户界面开发库的比对介绍。 Tkinter Tkinter是Python官方提供的图形用户界面开发库,用于封装Tk GUI工具包,跨平台。但是,Tkinter工具包所包含的控件较少,帮助文档不健全,不便于我们开发复杂的图形用户界面。 PyQt PyQt是非Python官方提供的图形用户界面开发库,用于封装Qt工具包,跨平台。若想使用PyQt工具包,则需要额外安装软件包。 wxPython wxPython是非Python官方提供的图形用户界面开发库,也跨平台。它提供了丰富的控件,可用于开发复杂的图形用户界面。它的工具包帮助文档很完善,案例也很丰富。 参考书目:关东升《看漫画学Python:有趣、有料、好玩、好用》 python2利用TKinter生成投影界面工具 个人选择先试用一下官方Tkinter库,代码为界面部分的功能: #coding=utf-8 import arcpy import os import time from Def_Projection_ROAD import projection #python2投影函数 from
  • 如何在不知道小部件的字体系列/大小的情况下更改小部件的字体样式?(How to change a widget's font style without knowing the widget's font family/size?)
    问题 有没有办法在不知道小部件的字体系列和字体大小的情况下更改Tkinter小部件的字体样式? 用例:我们使用标准的Tkinter小部件( Label , Entry , Text等)创建UI。 在我们的应用程序运行时,我们可能希望使用.config()方法将这些窗口小部件的字体样式动态更改为粗体和/或斜体。 不幸的是,如果不指定字体的系列和大小,似乎无法指定字体规格。 以下是我们想做的事的例子,但这些例子都不起作用: widget.config(font='bold') 或者 widget.config(font=( None, None, 'bold' )) 回答1 有一种比使用.config()更改应用程序字体更好的方法,特别是如果您的目标是更改整个小部件(或所有小部件)的字体时,则尤其如此。 Tk真正的一大特色是“命名字体”的概念。 命名字体的优点在于,如果您更新字体,则使用该字体的所有小部件都将自动更新。 因此,只需配置一次小部件以使用这些自定义字体,然后更改属性就变得微不足道了。 这是一个简单的例子: # python 2 imports # import Tkinter as tk # import tkFont # python 3 imports import tkinter as tk import tkinter.font as tkFont class
  • Python Tkinter (二)
    摘自 https://www.zhihu.com/question/32703639?sort=created 作者:Naples 链接:https://www.zhihu.com/question/32703639/answer/165326590 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 先说下我个人的情况,使用Matlab已3年有余,期间编写过几个专业方面的计算程序以及做过数个地铁振动信号处理分析方面的项目,有一定的编程基础。大概4个月前正式学习Python,用了2个月时间过了一遍Python的基本知识及语法,然后用了2~3天(课余时间)的时间仿照扇贝网背诵英语单词的模式,写了一个背诵日语单词的软件Anki的底层代码(200余句),输入输出都在shell里,用起来很不方便。然后开始尝试GUI,首先选择的就是Python自带的Tkinter,然后在网上找了Tkinter的相关文档:第一份是Tkinter简明教程,不知所云,几乎没什么帮助;第二份是2014年度辛星Tkinter教程第二版,内容浅显易懂;第三份是Python GUI Programming Cookbook,内容详细,帮助很大。大概用了5-6天的时间,边看文档写出了带有简单GUI界面的Anki2.0。又经过之后的组件升级,增加了许多功能,更新到了Anki3.2。先上图:
  • python制作界面_python做界面
    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 在python中有多个图形界面开发的库,一般我们会见到用到的有tkinter,pyqt,wx,pywin等这几个库,但是一般比较简单的就是tkintertkinter :是 python 的标准 tk gui 工具包的接口,也是python自带的库,使用tkinter的话就不需要另外下载包,而是直接导入模块就可以了from tkinter import*但是一般一开始学习做的可以尝试... python也可以创建界面,需要导入tkinter 具体看代码:from tkinter import * def btnclick():textlabel=我点击了按钮 root = tk(classname=我的第一个窗口程序); textlabel = label(root,text = 提示显示,justify=left,padx=10)textlabel.pack(side = top) btn = button(root)btn=点击测试btn =btnclickbtn.pack(side... 操作场景该任务指导您使用 python 语言,通过密钥对鉴权来对您的 api 进行认证管理。 操作步骤在 api 网关控制台,创建一个 api,选择鉴权类型为“密钥对鉴权”
  • Python tkinter -- 第18章 画布控件之Arc(圆弧)
    18.2.14 create_arc(*args, **kw) *args 可以是一个(x1, y1, x2, y2)的矩形元组,也可以是4个坐标参数x1, y1, x2, y2。其他的参数都会产生tcl.Error。*args实际上就是传入一个矩形的左上与右下坐标,在定义的矩形范围内,创建一个弧形(ARC)、扇形(PIESLICE)或弓形(CHORD)。新创建的对象位于显示的最前端。创建成功后返回该对象的 ID (1)*args :定义要创建对象的边界(x1, y1, x2, y2) (2)**kw: kw选项的具体含义: 选项含义activedash当鼠标移动到对象边线上面的时候,绘制虚线轮廓线activefill当鼠标移动到对象上面的时候,填充的颜色activeoutline当鼠标移动到对象上面的时候,绘制轮廓线的颜色activeoutlinestipple当鼠标移动到对象上面的时候,指定填充轮廓的位图注:仅在直线边框上有效,对弧线无效。activestipple鼠标位于对象上时,指定填充位图。注:对含有弧线的图形无效。activewidth当鼠标移动到对象上面的时候,指定边框的宽度。dash绘制虚线轮廓线。默认是实线轮廓线。disableddash当对象状态为 DISABLE 的时候,绘制虚线disabledfill当对象状态为 DISABLE 的时候
  • python3+tkinter+pyserial编写一个串口控制工具
    python3+tkinter+pyserial编写一个串口控制工具 首先展示一下自己做的串口工具界面的全貌 可以看到其中包括文本框、选项框、按键、输入框还有列表,整个界面是用tkinter 实现的。 tkinter是一个方便使用python语言做界面的库,内涵多种控件,使用灵活方便 在windows系统下,tkinter 是python的自带库,就和re、os一样,直接import就能用; 但是在linux系统下,tkinter需要自行安装,指令如下: sudo apt-get update sudo apt-get install python3-tk 如果不行的话,需要自己去github或者 pypi.org网站找安装包,然后在终端切换到包所在的目录,输入 python setup.py install 一般上面两种办法都能安装成功的, import tkinter试一下,不报错就说明安装成功了。 下面代码主要是tkinter对各控件的布局、参数设置的内容,可以直接运行。具体的执行内容pass掉了。 简单概括这个脚本所包含的tkinter的使用: 1.创建Tk父窗口,作为对象调用set_init_window进行窗口控件初始化 2.涉及到按钮Button、框架Frame、标签Label、输入框Entry 还有普通文本框Text、滚动文本框scrolltext
  • python tkinter从命令中使用的函数返回值(python tkinter return value from function used in command)
    问题 我如何获得A到C的返回值? 我不是在上课。 def button: mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0) A = B.get() return A B = StringVar() C = "" myentry = Entry(myGui, textvariable = B).grid(row = 1, column = 0) Submit = Button(myGui, text = "Submit", command = button).grid(row = 1, column = 1) 回答1 简短的回答:您不能。 回调无法返回任何内容,因为没有任何地方可以将其返回到-事件循环除外,该事件循环对返回值没有任何作用。 在基于事件的应用程序中,通常要做的是在类上设置属性。 或者,如果您是初学者,则可以设置全局变量。 对于必须随时间进行维护的实际代码,使用全局变量并不是一个好主意,但是可以进行实验。 因此,例如,由于在您的示例中C似乎是一个全局变量,因此您可以执行以下操作: def button(): global C mylabel = Label(myGui, text = "hi").grid(row = 0, column = 0) A = B.get() C = A 回答2