Как проверить ввод текстовых полей в режиме реального времени - PullRequest
0 голосов
/ 13 апреля 2019

Это приложение, которое запрашивает математическую задачу и пользовательские вводы отвечают в текстовом поле в виде целых чисел, а кнопка 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 функцией?

1 Ответ

0 голосов
/ 13 апреля 2019

На ваш первый вопрос есть два способа сделать это.Либо вы используете метод 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...