作者FreedomMax (FreedomKnight)
看板Python
标题[问题] 关於bind中的event
时间Tue Jul 23 11:50:13 2013
不好意思,我想请问一下
我最近在用 GUI 的时候
发现很多大大说在使用 bind 的时候
可以使用类似
btn.bind("<Button-1>", lambda event: fun())
我想问的就是,其中的 event 从哪里来,还有从哪里接收?
感觉上就算是 bind 的 function 主体里面也接不到 event
还有就是谁产生 event 给他呀?
我只是想问这个有关 lambda 问题
稍微补充一下好了
在 tkinter 里面
define hello:
print("hello")
btn = Button(text = "按钮", command = add)
这样这个按钮就可以按一下就让 function 跟按钮事件结合
但我上网求助了一下要传参数的话可以利用 lambda
def add(x, y):
return x + y
btn = Button(text = "add", command = lambda x = 5, y = 6: add(x, y))
这里我都还大致理解
但是在 tkinter 里面还有别种事件触发的方式,
就是把事件名跟 function 用 bind 结合在一起
btn.bind("<Button-1>", lambda event, x = 5, y = 6: add(x, y))
看得出来 bind 是要求第二个参数是把 function 传给 bind
最後透过 bind 帮我呼叫我传入的 function
但我不懂的是他规定一定要有 event 这个参数
但他并没有跟任何人结合在一起呀
而且我也自己做个 function 尝试模仿一下
bind 好像没办法抓到 event 的说
顶多
btn.bind("<Button-1>", lambda event: add(5, 6), print(event))
顶多在 lambda 里面可以印出 event 是个 object
所以我就不知道 tkinter 怎麽做到传入 event 以及拿 event 出来
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 61.58.66.233
1F:推 darkgerm:那是 lambda 的语法,event 是 lambda 的参数名字 07/23 12:05
2F:→ darkgerm:f=lambda x,y: None 就跟 def f(x,y): return None 一样 07/23 12:06
3F:→ uranusjr:我想他的问题是那个传进来的参数是哪来的 07/23 12:09
4F:推 ck574b027:看到他用的标题我想的也跟一楼一样,觉得他被用字误导了 07/23 12:22
5F:→ ya790206:哪套 gui lib? tkinter ? 07/23 12:57
6F:→ FreedomMax:是 tkinter 没错 07/23 19:03
7F:→ FreedomMax:我是知道那是参数,但是bind时并没有给任何东西 07/23 19:04
8F:→ FreedomMax:所以我在想,如果是我自己写bind要怎麽接跟传那个参数 07/23 19:05
9F:→ FreedomMax:因为bind规定一定要有那个参数event,所以我不太懂运作 07/23 19:05
※ 编辑: FreedomMax 来自: 61.58.66.233 (07/23 19:19)
10F:→ os653:看不太懂你的问题,如果答非所问请自动忽略 07/24 01:09
11F:→ os653:看起来你搞错bind的功能,bind不是帮你呼叫function的,bind 07/24 01:09
12F:→ os653:是帮你注册一个函数,让系统在事件发生的时候自动调用。实际 07/24 01:12
13F:→ os653:上呼叫该function的系统应该是类似大型的无限回圈,它会一直 07/24 01:16
14F:→ os653:检查有没有事件(event)发生,有事件发生的话,找找看有没有 07/24 01:17
15F:→ os653:注册来处理该事件的函数,有就呼叫该函数,没有就呼叫预设的 07/24 01:17
16F:→ os653:处理函数。呼叫处理函数时给的参数格式当然是固定的,通常第 07/24 01:19
17F:→ os653:一个就是该事件本身,可以让处理函数知道该事件是由哪里产生 07/24 01:23
18F:→ os653:(滑鼠、键盘、etc..),第二个以後的就不一定,看tkinter规定 07/24 01:26
19F:→ os653:建议去看wxpython in action这本书的第三章,Working in an 07/24 01:27
20F:→ os653:event-driven enviroment,网路上中英文版都有,虽然实作上 07/24 01:28
21F:→ os653:与tkinter绝对不同,但中心思想没啥差,看完应该就能了解了 07/24 01:34
22F:→ os653:题外话,tkinter其实不怎麽好用,资料也不大好找...也许是我 07/24 01:36
23F:→ os653:太弱的关系XD 除了不用另外安装以外,没啥特别突出的优点 07/24 01:38
24F:→ FreedomMax:感谢大大,其实我是知道他背後应该是有个事件队列 07/24 04:03
25F:→ FreedomMax:但我现在是打算假设换成是我要做那个bind 07/24 04:04
26F:→ FreedomMax:那个event我是不知道谁传过去的、以及谁去接收 07/24 04:05
27F:→ FreedomMax:我该如何有办法接收到那个lambda 中的 event 07/24 04:18
28F:→ os653:tkinter底层是Tcl/Tk,所以想做到bind的功能应该很麻烦耶, 07/24 05:03
29F:→ os653:如果不局限在tkinter的话,wxpython要写一个自己的bind倒是 07/24 05:03
30F:→ os653:简单许多 07/24 05:05
31F:→ os653:把所有事件注册到同一个函数在自己分派出去不知道可不可行? 07/24 05:12