[問題] 關於bind中的event

看板Python作者 (FreedomKnight)時間12年前 (2013/07/23 11:50), 編輯推噓2(2030)
留言32則, 6人參與, 最新討論串1/1
不好意思,我想請問一下 我最近在用 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

07/23 12:05, , 1F
那是 lambda 的語法,event 是 lambda 的參數名字
07/23 12:05, 1F

07/23 12:06, , 2F
f=lambda x,y: None 就跟 def f(x,y): return None 一樣
07/23 12:06, 2F

07/23 12:09, , 3F
我想他的問題是那個傳進來的參數是哪來的
07/23 12:09, 3F

07/23 12:22, , 4F
看到他用的標題我想的也跟一樓一樣,覺得他被用字誤導了
07/23 12:22, 4F

07/23 12:57, , 5F
哪套 gui lib? tkinter ?
07/23 12:57, 5F

07/23 19:03, , 6F
是 tkinter 沒錯
07/23 19:03, 6F

07/23 19:04, , 7F
我是知道那是參數,但是bind時並沒有給任何東西
07/23 19:04, 7F

07/23 19:05, , 8F
所以我在想,如果是我自己寫bind要怎麼接跟傳那個參數
07/23 19:05, 8F

07/23 19:05, , 9F
因為bind規定一定要有那個參數event,所以我不太懂運作
07/23 19:05, 9F
※ 編輯: FreedomMax 來自: 61.58.66.233 (07/23 19:19)

07/24 01:09, , 10F
看不太懂你的問題,如果答非所問請自動忽略
07/24 01:09, 10F

07/24 01:09, , 11F
看起來你搞錯bind的功能,bind不是幫你呼叫function的,bind
07/24 01:09, 11F

07/24 01:12, , 12F
是幫你註冊一個函數,讓系統在事件發生的時候自動調用。實際
07/24 01:12, 12F

07/24 01:16, , 13F
上呼叫該function的系統應該是類似大型的無限迴圈,它會一直
07/24 01:16, 13F

07/24 01:17, , 14F
檢查有沒有事件(event)發生,有事件發生的話,找找看有沒有
07/24 01:17, 14F

07/24 01:17, , 15F
註冊來處理該事件的函數,有就呼叫該函數,沒有就呼叫預設的
07/24 01:17, 15F

07/24 01:19, , 16F
處理函數。呼叫處理函數時給的參數格式當然是固定的,通常第
07/24 01:19, 16F

07/24 01:23, , 17F
一個就是該事件本身,可以讓處理函數知道該事件是由哪裡產生
07/24 01:23, 17F

07/24 01:26, , 18F
(滑鼠、鍵盤、etc..),第二個以後的就不一定,看tkinter規定
07/24 01:26, 18F

07/24 01:27, , 19F
建議去看wxpython in action這本書的第三章,Working in an
07/24 01:27, 19F

07/24 01:28, , 20F
event-driven enviroment,網路上中英文版都有,雖然實作上
07/24 01:28, 20F

07/24 01:34, , 21F
與tkinter絕對不同,但中心思想沒啥差,看完應該就能了解了
07/24 01:34, 21F

07/24 01:36, , 22F
題外話,tkinter其實不怎麼好用,資料也不大好找...也許是我
07/24 01:36, 22F

07/24 01:38, , 23F
太弱的關係XD 除了不用另外安裝以外,沒啥特別突出的優點
07/24 01:38, 23F

07/24 04:03, , 24F
感謝大大,其實我是知道他背後應該是有個事件隊列
07/24 04:03, 24F

07/24 04:04, , 25F
但我現在是打算假設換成是我要做那個bind
07/24 04:04, 25F

07/24 04:05, , 26F
那個event我是不知道誰傳過去的、以及誰去接收
07/24 04:05, 26F

07/24 04:18, , 27F
我該如何有辦法接收到那個lambda 中的 event
07/24 04:18, 27F

07/24 05:03, , 28F
tkinter底層是Tcl/Tk,所以想做到bind的功能應該很麻煩耶,
07/24 05:03, 28F

07/24 05:03, , 29F
如果不侷限在tkinter的話,wxpython要寫一個自己的bind倒是
07/24 05:03, 29F

07/24 05:05, , 30F
簡單許多
07/24 05:05, 30F

07/24 05:12, , 31F
把所有事件註冊到同一個函數在自己分派出去不知道可不可行?
07/24 05:12, 31F

07/24 05:15, , 32F
這兩篇看看合不合用http://ppt.cc/ySzw http://ppt.cc/J8gc
07/24 05:15, 32F
文章代碼(AID): #1HxVruiu (Python)
文章代碼(AID): #1HxVruiu (Python)