簡體   English   中英

同時綁定到 2 個事件 tkinter python

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM