Проверка, нажимает ли пользователь "Возврат", когда выбран в поле ввода Tkinter
Я использую Tkinter для создания GUI для простого калькулятора геометрии, который я создаю.
По сути, у меня есть поле ввода. Я хочу, чтобы программа /GUI/ система определяла, когда пользователь программы нажимает клавишу "Ввод" или "Возврат", пока они находятся в поле ввода. Когда это будет обнаружено, я хочу, чтобы содержимое поля ввода было добавлено в список, который я определил ранее. Я также хочу, чтобы в графическом интерфейсе пользователя была создана простая метка, отображающая содержимое списка (включая добавленные элементы). Обратите внимание, что список начинается с нуля.
Вот мой код до сих пор:
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. Я надеюсь, что вы понимаете, с чем я пытаюсь получить помощь, и я искал объяснение, которое я не смог понять безуспешно.
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()
Решение состоит в том, чтобы установить привязку на самом виджете. Таким образом, привязка будет применяться только тогда, когда фокус находится на этом виджете. А поскольку вы связываете определенный ключ, вам не нужно проверять его значение позже. Вы знаете, что пользователь нажал клавишу возврата, потому что это единственное, что вызывает срабатывание привязки.
...
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(...)
возвращается.