PYTHON TKINTER > e = Entry() > e.bind(», функция)

#python #tkinter #tkinter-entry

#питон #tkinter #tkinter-запись

Вопрос:

Мне пока не разрешено добавлять изображения в сообщения с вопросами.

Вопрос ниже:

В настоящее время мое приложение использует окно, которое закодировано в классе.

Моя конечная цель — нажать enter при вводе букв и цифр в виджет ввода и нажать enter, после чего функция обновит текст, соответствующий метке в моем главном окне.

Подробное описание ниже:

Я не могу понять, как создать и ввести, а затем привязать клавишу ввода, чтобы при запуске моего приложения я мог щелкнуть по записи, ввести значение и нажать ввод.

Я вижу множество ссылок на кнопки, и я могу заставить кнопку работать, но я пытаюсь научиться что-то делать и не хочу полагаться на кнопки в данном случае.

Я видел в некоторых других сообщениях, что если вы вызываете .get объект entry, код python просто выполнит его и двинется дальше. Я тестировал с помощью инструкции print в функции, которую я хочу вызвать при нажатии enter, и инструкция print появилась в терминале до того, как я ввел что-либо в виджете ввода. Затем я попытался ввести текст и нажать enter, но ничего не произошло.

Должен ли я отказаться от привязки клавиши ENTER и придерживаться кнопок в tkinter, как правило, или есть правильный способ сделать это? В моем примере кода вы увидите up_R функцию, которую я пытаюсь выполнить при нажатииEnter. Если я использую up_R() , он выполняется немедленно. Если я использую up_R , то получаю сообщение об ошибке TCL.

Конкретный частичный код, расположенный ниже:

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

Полный код приведен ниже, если требуется помощь:

 #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()
 

Комментарии:

1. Я только что привел в порядок ваш пост. Блоки кода должны быть либо с отступом, либо огорожены тремя обратными метками ( ``` ), а не обоими. И обратите внимание, что это должны быть обратные метки, а не одинарные кавычки ( ' ).

2. self.e.bind('<ENTER>',up_R()) должно быть self.e.bind('<Return>', lambda e: up_R()) вместо.

Ответ №1:

Ввод должен быть изменен на Return, и функция должна принять событие

Кроме того, не забудьте в «классе» использовать self в методе и self.method для его вызова.

      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)
 

Комментарии:

1. Спасибо. Я попробовал это, и у меня не возникает той же проблемы. Однако, похоже, у меня возникла проблема с размещением или порядком. Я либо получаю сообщение об ошибке, что up_R не определен. Я попробую поиграть с entry и def, чтобы посмотреть, смогу ли я заставить его работать. Основываясь на том, что было отправлено, я на правильном пути, но делаю что-то неправильно, кроме ответа, который вы все предоставили.

2. Как только «доверенный член сообщества» одобрит, я внес правку, чтобы заставить ответ работать для класса Python.