วิธีตรวจสอบอินพุตกล่องข้อความแบบเรียลไทม์

เป็นแอปพลิเคชันที่ถามปัญหาทางคณิตศาสตร์และผู้ใช้ป้อนคำตอบในกล่องข้อความเป็นจำนวนเต็ม และปุ่ม 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