Проверка того, нажимает ли пользователь «Возврат» при выборе в поле ввода Tkinter

Я использую Tkinter для создания графического интерфейса для простого калькулятора геометрии, который я создаю.

По сути, у меня есть поле для входа. Я хочу, чтобы программа/графический интерфейс/система обнаруживала, когда пользователь программы нажимает клавишу «Ввод» или «возврат», ПОКА они находятся в поле ввода. Когда это обнаружено, я хочу, чтобы содержимое поля ввода было добавлено к списку, который я определил ранее. Я также хочу, чтобы в графическом интерфейсе была создана простая метка, отображающая содержимое списка (включая добавленные элементы). Обратите внимание, что список начинается с пустого места.

Вот мой код:

from tkinter import *
#Window setup(ignore this)
app = Tk()
app.title('Geometry Calculator')
app.geometry('384x192+491+216')
app.iconbitmap('Geo.ico')
app.minsize(width=256, height=96)
app.maxsize(width=384, height=192)
app.configure(bg='WhiteSmoke')
#This is the emtry list...
PointList = []
#Here is where I define the variable that I will be appending to the list (which is the              object of the Entry box below)
StrPoint = StringVar()
def list_add(event):
#I don't really know how the bind-checking works and how I would implement it; I want to check if the user hits enter while in the Entry box here
    if event.char == '':
        PointList.append(StrPoint)
e1 = Entry(textvariable=StrPoint).grid(row=0, column=0)
app.bind('<Return>', list_add)

mainloop()

Я действительно не знаю, как правильно проверить «Возврат», а затем использовать его в операторе if. Я надеюсь, вы понимаете, с чем я пытаюсь получить помощь, и я искал объяснение, которое я не мог понять, но безуспешно.


person Community    schedule 15.04.2014    source источник


Ответы (2)


Вместо привязки к app просто привяжите его к объекту виджета Entry, т. е. e1

from tkinter import *
#Window setup(ignore this)
app = Tk()
app.title('Geometry Calculator')
app.geometry('384x192+491+216')
app.iconbitmap('Geo.ico')
app.minsize(width=256, height=96)
app.maxsize(width=384, height=192)
app.configure(bg='WhiteSmoke')
#This is the emtry list...
PointList = []
#Here is where I define the variable that I will be appending to the list (which is the              object of the Entry box below)
StrPoint = StringVar()
def list_add(event):
    print ("hello")
#I don't really know how the bind-checking works and how I would implement it; I want to check if the user hits enter while in the Entry box here
    if event.char == '':
        PointList.append(StrPoint)
e1 = Entry(textvariable=StrPoint)
e1.grid(row=0, column=0)#use grid in next line,else it would return None
e1.bind('<Return>', list_add)# bind Entry

mainloop()
person Alok    schedule 15.04.2014
comment
Это все еще возвращает мне ошибку: AttributeError: объект 'str' не имеет атрибута '_bind'. У меня есть код Entry.bind('‹Return›', list_add), но он, похоже, не распознает ‹Return› и ожидал разное, а не строку. - person ; 15.04.2014
comment
Потому что вы привязываете сам виджет. Вы должны связать его объект, который в данном случае e1 - person Alok; 15.04.2014
comment
как я указал в коде: e1.bind('<Return>', list_add). также не забудьте разместить виджет в два этапа, то есть использовать e1.grid в следующей строке, иначе e1 вернет None, и вы не сможете его привязать. - person Alok; 15.04.2014
comment
Пожалуйста, примите ответ, чтобы все знали, что ваша проблема решена :) - person Alok; 15.04.2014

Решение состоит в том, чтобы установить привязку к самому виджету. Таким образом, привязка будет применяться только тогда, когда фокус находится на этом виджете. А поскольку вы привязываетесь к определенному ключу, вам не нужно проверять значение позже. Вы знаете, что пользователь нажал клавишу возврата, потому что это единственное, что вызовет срабатывание привязки.

...
e1.bind('<Return>', list_add)
...

У вас есть еще одна проблема в том, что ваша функция list_add должна вызывать метод get переменной, а не напрямую обращаться к переменной. Однако, поскольку вы не используете никаких специальных функций StringVar, он вам действительно не нужен — это просто еще одна вещь, которой вы должны управлять.

Вот как это сделать без StringVar:

def list_add(event):
    PointLit.append(e1.get())
...
e1 = Entry(app)
e1.grid(row=0, column=0)
e1.bind('<Return>', list_add)

Обратите внимание, что вам нужно создать виджет и разместить виджет в два этапа. Делая это так, как вы это делали (e1=Entry(...).grid(...) приведет к тому, что e1 будет None, так как это то, что возвращает .grid(...).

person Bryan Oakley    schedule 15.04.2014