【问题标题】:How to validate text box inputs in real-time如何实时验证文本框输入
【发布时间】:2019-04-13 01:47:35
【问题描述】:

它是一个应用程序,它提出一个数学问题,用户在文本框中输入整数形式的答案,一个按钮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 又会调用函数submit,而不是直接将键f 链接到submit 函数?

【问题讨论】:

  • 文本框是指Entry 小部件还是Text 小部件?
  • @HenryYik 条目小部件。我在问题中添加了文本框代码。

标签: python python-3.x tkinter textbox


【解决方案1】:

对于您的第一个问题,有两种方法可以解决。您可以在StringVar 上使用trace 方法,或者在您的条目上使用validcommand。您可以阅读有关如何使用herehere 两种方法的详细信息

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 的绑定上,我想您可以在 submit 函数中简单地调用 game.unbind('f')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-09
    • 2012-11-12
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多