Search code examples
pythontkintertkinter-entry

PYTHON TKINTER > e = Entry() > e.bind('<ENTER>', function)


I am not allowed to add images yet to question posts.

Question below:

My app currently uses a window that is coded in a class.

My ultimate goal is to press enter while entering letters and numbers into an entry widget and press enter, then the function would update text that correlates to a label in my main window.

Detailed description below:

I cannot figure out how to create and entry and then bind the enter key so that when I run my app, I can click in the entry, type a value and press enter.

I see plenty of button references and I can get the button to work, but I am trying to learn how to do things and do not want to rely on buttons in this instance.

I saw in some other posts that if you call .get with an entry object, that the python code will just execute it and move on. I tested with a print statement in the function I want to call upon pressing enter, and the print statement appeared in the terminal before I typed anything in the entry widget. I then tried to type and press enter, and nothing would occur.

Should I abandon binding the ENTER key and stick with buttons in tkinter as a rule, or is there a proper way to do this? In my code example, you will see up_R is the function I am trying to execute when pressing Enter. If I use up_R(), it executes immediately. If I use up_R, then I get a TCL Error.

Specific Partial code located below:

def up_R():
    print('Makes it here')
    self.R.update_disp(self.e.get())
            
self.e.bind('<ENTER>',up_R)

The full code is below if required for assistance:

#NOAA SPACE WEATHER CONDITIONS

from tkinter import *


class window:
    
    def __init__(self):
        
        #main window
        self.window = Tk()
        self.window.title('NOAA SPACE WEATHER CONDITIONS')
        self.window.geometry('800x600')
        
        #window organization
        self.window.grid_rowconfigure(0, weight = 1)
        self.window.grid_rowconfigure(1, weight = 1)
        
        self.window.grid_columnconfigure(0, weight = 1)
        self.window.grid_columnconfigure(1, weight = 1)
        
        #temp entry frame
        self.e = Entry(self.window)
        self.e.grid(row = 1, column = 0, sticky=N)
        self.e.insert(END, 'R entry')              
        
        
        #init class R
        self.R = R()
        
        #init class S
        self.S = S()
        
        #init class g
        self.G = G()
        
        #frame for RSG
        self.frame = Frame(self.window)
        self.frame.grid(row = 0, column = 0, columnspan = 2, padx=10, pady=10)
        
        #disp class R
        self.rf = Frame(self.frame, highlightbackground='black', highlightcolor='black', highlightthickness=1)
        self.rf.pack(side = LEFT)
        
        self.rl = Label(self.rf, text = self.R.dkey, bg='#caf57a')
        self.rl.pack(side=TOP)
        
        self.rl_lower = Label(self.rf, text= self.R.tile_text, bg='#caf57a')
        self.rl.pack(side=BOTTOM)
        
        #Value update methods
#        self.R.update_disp(self.e.get()) 
        
        
#        #action
        def up_R():
            print('Makes it here')
            self.R.update_disp(self.e.get())
            
        self.e.bind('<ENTER>',up_R())
        
        #main window call - goes at end of class
        self.window.mainloop()


class R:
    def __init__(self):
        d = {'R':'None','R1':'Minor','R2':'Moderate','R3':'Strong','R4':'Severe','R5':'Extreme'}

        self.dkey = 'R'
        self.tile_text = d[self.dkey]
        print(d[self.dkey])
    
    def update_disp(self, dkey):
        self.dkey = dkey
        



class S:
    d = {'S1':'Minor','S2':'Moderate','S3':'Strong','S4':'Severe','S5':'Extreme'}
    pass
    

class G:
    d = {'G1':'Minor','G2':'Moderate','G3':'Strong','G4':'Severe','G5':'Extreme'}
    pass


t = window()

Solution

  • The ENTER should be changed with Return, and the function should accept an event

    Also, don't forget in a 'class' to use self in the method and self.method to call it.

         def up_R(self, event):
                print('Makes it here')
                self.R.update_disp(self.e.get())
                self.rl.config(text=self.R.dkey)
                
            self.e.bind('<Return>', self.up_R)