如何实时验证文本框输入
How to validate text box inputs in real-time
它是一个应用程序,它提出一个数学问题,用户在文本框中输入整数答案,然后一个按钮 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
有没有办法实时处理文本框输入以确保输入的每个字符都是整数?如果用户输入除 0-9 以外的任何内容,我希望它在文本框中不显示任何内容。
此外,我在按下 submitbtn
一次后将其禁用,但反复按 f 会不断增加 correct_answer
变量。有没有一种方法可以将密钥绑定到 submitbtn
进而调用函数 submit
,而不是直接将密钥 f
链接到 submit
函数?
对于您的第一个问题,有两种方法可以解决。您可以在 StringVar
上使用 trace
方法,或者在您的条目上使用 validcommand
。您可以阅读有关如何使用这两种方法的详细信息 here and here
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')
15=]函数。
它是一个应用程序,它提出一个数学问题,用户在文本框中输入整数答案,然后一个按钮 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
有没有办法实时处理文本框输入以确保输入的每个字符都是整数?如果用户输入除 0-9 以外的任何内容,我希望它在文本框中不显示任何内容。
此外,我在按下
submitbtn
一次后将其禁用,但反复按 f 会不断增加correct_answer
变量。有没有一种方法可以将密钥绑定到submitbtn
进而调用函数submit
,而不是直接将密钥f
链接到submit
函数?
对于您的第一个问题,有两种方法可以解决。您可以在 StringVar
上使用 trace
方法,或者在您的条目上使用 validcommand
。您可以阅读有关如何使用这两种方法的详细信息 here and here
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')
15=]函数。