[英]bind to 2 events at the same time in tkinter python
我正在用 tkinter 制作一個應用程序,這是 python 中用於 GUI 編程的模塊,我想要一個按鈕對鼠標點擊和鍵盤輸入鍵做出反應。 有辦法嗎?
您可以將不止一個東西綁定到小部件,包括按鈕,但是專門將按鍵按下綁定到按鈕通常不是一個可行的解決方案。 原因很簡單。 為了讓小部件識別按鍵,它必須有焦點。 通常,小部件獲得焦點的方式是通過鼠標單擊或 Tab 鍵。 您可以單擊您的小部件以便按回車鍵(這實際上不適用於Button
小部件),或者您可以多次按 Tab 鍵直到按鈕獲得焦點,然后按回車鍵。 這可以像按幾下或 1000 次標簽一樣簡單。 這取決於您的應用程序和選項卡順序中的小部件數量。
您可以做的是使用bind_all
將按鍵重定向到您的點擊 function(如下所示)。 請記住,如果屏幕上有Text
小部件之類的東西,並且您正在輸入它,則每次按下回車鍵時,它都會“點擊”您的按鈕。 當然,如果您的Text
小部件有焦點,您可以簡單地unbind
按鍵,然后如果它失去焦點,則再次bind
它,但這可能會變得一團糟。 特別是如果您有很多Text
小部件。 我看到您理智地執行此操作的唯一方法是使用 F 鍵(F1、F2 等)或組合鍵(例如 Shift+Return)來bind_all
,這不是常見的按鍵操作。
import tkinter as tk
class App(tk.Tk):
def __init__(self):
tk.Tk.__init__(self)
tk.Button(self, text="click", command=self.click).pack()
self.bind_all('<Return>', self.click)
def click(self, event=None):
if event:
print('I have been virtually clicked')
else:
print('I have been clicked')
if __name__ == "__main__":
App().mainloop()
是的,可以有多種方法來做到這一點。 首先,讓我們更好地理解像invoke()
這樣的按鈕方法,它用於調用作為參數傳遞給command
參數的回調 function。 因此,將invoke()
方法綁定到<Return>
序列,如果按鈕具有焦點,我們可以使用返回鍵調用回調 function 。 要將焦點放在按鈕上,我們可以使用選項卡,系統默認邊框將指示哪個小部件具有焦點。
所以看看這個例子,這里的回調 function 可以通過點擊按鈕以及當按鈕有焦點時按回車鍵來調用。 要將焦點放在按鈕上,請按Tab鍵,然后按回車鍵。
import tkinter as tk
import tkinter.ttk as ttk
def func():
print('Button is pressed')
root = tk.Tk()
root.geometry('200x200')
b1 = ttk.Button(root, text='Button 1', command=func)
b1.bind('<Return>', lambda e: b1.invoke())
b1.pack()
root.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.