Python Forum
TkInter Binding Buttons
Thread Rating:
  • 0 Vote(s) - 0 Average
  • 1
  • 2
  • 3
  • 4
  • 5
TkInter Binding Buttons
#1
Hi! I wanted to get if a key(Enter/F1/BTN1) was pressed, but it is not working as i thought. :(
So the desired outcome:


import tkinter as tk

def pressed_enter():
    print('You pressed Enter')

def pressed_F1():
    print('You pressed F1')

def pressed_btn1():
    print('Mouse BTN1 was pressed')

root = tk.Tk()
root.geometry('200x250')

root.bind("<Return>", pressed_enter())
root.bind("<KeyPress-F1>", pressed_F1())
root.bind("<Button-1>", pressed_btn1())

root.mainloop()

(Apr-04-2020, 05:10 PM)ifigazsi Wrote: So the desired outcome:

- Not to run at start
- Run as many times, as a button was pressed.
Reply
#2
pressed_enter is a function. You can bind a function. pressed_enter() calls the function and is the function's return value (None). You cannot bind None.
root.bind("<Return>", pressed_enter())
This code works:
import tkinter as tk
 
def pressed_enter(event):
    print(event)
 
def pressed_F1(event):
    print(event)
 
def pressed_btn1(event):
    print(event)
 
root = tk.Tk()
root.geometry('200x250')
 
root.bind("<Return>", pressed_enter)
root.bind("<KeyPress-F1>", pressed_F1)
root.bind("<Button-1>", pressed_btn1)
 
root.mainloop()
Reply
#3
(Apr-04-2020, 07:20 PM)deanhystad Wrote: pressed_enter is a function. You can bind a function. pressed_enter() calls the function and is the function's return value (None). You cannot bind None.

Thanks, now it works!

One more:

Is it possible that tk.Button and Key binding use the same function?



import tkinter as tk

root = tk.Tk()
root.geometry('250x100')

############# FUNCTIONS ###########x

def check_in_database_with_btn(data, chk):
    if data in chk:
        print(f'{data} was found in database.')
    else:
        print(f'{data} no match in database.')

def check_in_database_with_key(event, data, chk):
    check_in_database_with_btn(data, chk)

########### DATABASE ##################

chk_database = ['Eric', 'John', 'Graham', 'Terry']


############ ENTRY & BUTTON & BIND ######################

field_entry = tk.Entry(root, width=20)
field_entry.grid(row=0, column=0)

chk_in_database_btn = tk.Button(root, text='Check database',
                                command=lambda: check_in_database_with_btn(field_entry.get(), chk_database))
chk_in_database_btn.grid(row=0, column=1)

field_entry.bind("<Return>", lambda event: check_in_database_with_key(event, field_entry.get(), chk_database))

root.mainloop()
Reply
#4
Ok, i got the answer: simply, with invoke()

(Apr-05-2020, 10:47 AM)ifigazsi Wrote: Is it possible that tk.Button and Key binding use the same function?

field_entry.bind("<Return>", lambda event: chk_in_database_btn.invoke())
Reply
#5
Yes, you can bind both a key and a button to the same function. You were really close with the lambda. All you had to do was throw away the event which you don't care about.
import tkinter as tk
 
root = tk.Tk()
root.geometry('250x100')
 
def check_in_database(data, chk):
    if data in chk:
        print(f'{data} was found in database.')
    else:
        print(f'{data} no match in database.')
 
chk_database = ['Eric', 'John', 'Graham', 'Terry']
 
field_entry = tk.Entry(root, width=20)
field_entry.bind("<Return>",
                 lambda event: check_in_database(field_entry.get(), chk_database))
field_entry.grid(row=0, column=0)
 
tk.Button(root, text='Check database',
          command=lambda: check_in_database(field_entry.get(), chk_database)) \
          .grid(row=0, column=1)
 
root.mainloop()
Another useful tool is functools.partial
Reply
#6
(Apr-06-2020, 04:36 AM)deanhystad Wrote: Yes, you can bind both a key and a button to the same function. You were really close with the lambda. All you had to do was throw away the event which you don't care about.
import tkinter as tk
 
root = tk.Tk()
root.geometry('250x100')
 
def check_in_database(data, chk):
    if data in chk:
        print(f'{data} was found in database.')
    else:
        print(f'{data} no match in database.')
 
chk_database = ['Eric', 'John', 'Graham', 'Terry']
 
field_entry = tk.Entry(root, width=20)
field_entry.bind("<Return>",
                 lambda event: check_in_database(field_entry.get(), chk_database))
field_entry.grid(row=0, column=0)
 
tk.Button(root, text='Check database',
          command=lambda: check_in_database(field_entry.get(), chk_database)) \
          .grid(row=0, column=1)
 
root.mainloop()
Another useful tool is functools.partial
(Apr-06-2020, 04:36 AM)deanhystad Wrote: Yes, you can bind both a key and a button to the same function.

Thank you! :D
Reply


Possibly Related Threads…
Thread Author Replies Views Last Post
  Key Binding scope angus1964 1 1,168 Jun-30-2022, 08:17 PM
Last Post: deanhystad
  tkinter toggle buttons not working Nu2Python 26 6,767 Jan-23-2022, 06:49 PM
Last Post: Nu2Python
  kivy binding issue hammer 8 2,937 Nov-07-2021, 11:34 PM
Last Post: hammer
  [Tkinter] binding versus disable DPaul 6 6,596 May-05-2021, 05:17 PM
Last Post: DPaul
  [Tkinter] Binding Entry box to <Button-3> created in for loop iconit 5 4,875 Apr-22-2020, 05:47 AM
Last Post: iconit
  Making text clickable with binding DT2000 10 5,028 Apr-02-2020, 10:11 PM
Last Post: DT2000
  Issue on tkinter with buttons Reldaing 1 2,414 Jan-07-2020, 08:21 AM
Last Post: berckut72
  Need tkinter help with clicking buttons pythonprogrammer 2 2,399 Jan-03-2020, 04:43 AM
Last Post: joe_momma
  [Tkinter] Setting Binding to Entry created with a loop? p_hobbs 1 2,039 Nov-25-2019, 10:29 AM
Last Post: Larz60+
  Tkinter Buttons action d3fi 1 1,977 Nov-20-2019, 09:16 PM
Last Post: Larz60+

Forum Jump:

User Panel Messages

Announcements
Announcement #1 8/1/2020
Announcement #2 8/2/2020
Announcement #3 8/6/2020