Как проверить ввод текстового поля в режиме реального времени

Это приложение, которое задает математическую задачу, и пользователь вводит ответ в текстовом поле в виде целых чисел, а кнопка submitbtn проверяет, правильно это или нет. Я привязал клавишу клавиатуры f к функции, которая запускается при нажатии кнопки submitbtn, которая работает нормально, но клавиша f добавляется в текстовое поле после ответа пользователя до его отправки и выдает его как неправильный ответ.

Текстовое окно

text_Input = StringVar
txtbox = Entry(font=('arial',20, BOLD), textvariable=text_Input)
txtbox.grid(columnspan = 2, row = 3, pady = 20)
txtbox.focus_set()

Кнопка отправки

submitbtn = Button(text="Submit", padx=10, pady=10, command=lambda:submit(txtbox.get(), y))

Отправить функцию

def submit(z, y):
    global correct_answer, wrong_answer, submitbtn
    y=str(y)
    if z==y:
        correct_answer+=1
        lbl2.configure(text=correct_answer)
    else:
        wrong_answer+=1
        lbl4.configure(text=wrong_answer)
    submitbtn.config(state="disabled")

Связывание

game.bind('f', lambda event: submit(txtbox.get(), y))
#"game" is the name of Tk()
#submit is the function linked to submitbtn
#This works well if I bind it to <Return> (Enter Key)

Фактический результат:

5+8

Пользователь вводит: 13

Нажимает «f», чтобы отправить ответ

Ответ обработан: 13f

  1. Есть ли способ обрабатывать ввод текстового поля в режиме реального времени, чтобы убедиться, что каждый введенный символ является целым числом? Если пользователь вводит что-либо, кроме 0-9, я хочу, чтобы он ничего не отмечал в текстовом поле.

  2. Кроме того, я отключаю submitbtn после однократного нажатия, но многократное нажатие f продолжает увеличивать переменную correct_answer. Есть ли способ связать ключ с submitbtn, который, в свою очередь, вызовет функцию submit, вместо того, чтобы напрямую связывать ключ f с функцией submit?


person RuDe009    schedule 13.04.2019    source источник
comment
Под текстовым полем вы подразумеваете Entry виджет или Text виджет?   -  person Henry Yik    schedule 13.04.2019
comment
Виджет входа @HenryYik. Я добавил код текстового поля в вопрос.   -  person RuDe009    schedule 13.04.2019


Ответы (1)


Для вашего первого вопроса есть два способа сделать это. Либо вы используете метод trace для своего StringVar, либо используете validcommand для своей записи. Подробнее об использовании обоих методов можно прочитать здесь и здесь

import tkinter as tk

root = tk.Tk()

# Use trace method on your StringVar

text_Input = tk.StringVar() # note that it is StringVar() with ()
txtbox = tk.Entry(font="Arial 20 bold",textvariable=text_Input)
txtbox.grid(columnspan = 2, row = 3, pady = 20)

def trace_method(*args):
    if text_Input.get().isdigit():
        pass
    else:
        text_Input.set(text_Input.get()[:-1])

text_Input.trace("w",trace_method)

# Use validatecommand attribute of entry widget

def onValidate(S):
    if S.isdigit():
        return True
    else:
        return False

vcmd = (root.register(onValidate),"%S")

txtbox2 = tk.Entry(font="Arial 20 bold",validate="key",validatecommand=vcmd)
txtbox2.grid(columnspan = 2, row = 4, pady = 20)

root.mainloop()

Что касается вашего второго вопроса, я не могу полностью понять, чего вы пытаетесь достичь, но если проблема заключается в привязке с ключом f, я полагаю, вы можете просто вызвать game.unbind('f') в своей функции submit.

person Henry Yik    schedule 13.04.2019