#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.