Cara memvalidasi input kotak teks secara real-time

Ini adalah aplikasi yang menanyakan soal matematika dan pengguna memasukkan jawaban dalam kotak teks sebagai bilangan bulat, dan tombol submitbtn memverifikasi apakah itu benar atau salah. Saya mengikat tombol keyboard f ke fungsi yang berjalan dengan menekan tombol submitbtn, yang berfungsi dengan baik, tetapi kunci f ditambahkan ke kotak teks setelah jawaban pengguna sebelum dikirimkan dan memberikannya sebagai jawaban yang salah.

Kolom tulisan

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

Tombol Kirim

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

Kirim Fungsi

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")

Mengikat

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)

Keluaran Sebenarnya:

5+8

Pengguna memasukkan: 13

Tekan 'f' untuk mengirimkan jawaban

Jawaban diproses: 13f

  1. Apakah ada cara untuk memproses input kotak teks secara real-time untuk memastikan setiap karakter yang dimasukkan adalah bilangan bulat? Jika pengguna memasukkan apa pun kecuali 0-9, saya ingin pengguna tidak mencatat apa pun di kotak teks.

  2. Juga, saya menonaktifkan submitbtn setelah ditekan sekali, tetapi menekan f berulang kali terus menambah variabel correct_answer. Apakah ada cara untuk mengikat kunci ke submitbtn yang pada gilirannya akan memanggil fungsi submit, alih-alih langsung menghubungkan fungsi kunci f ke submit?


person RuDe009    schedule 13.04.2019    source sumber
comment
Yang Anda maksud dengan kotak teks adalah Entry widget atau Text widget?   -  person Henry Yik    schedule 13.04.2019
comment
@HenryYik Widget Masuk. Saya menambahkan kode kotak teks ke pertanyaan.   -  person RuDe009    schedule 13.04.2019


Jawaban (1)


Untuk pertanyaan pertama Anda, ada dua cara untuk melakukannya. Entah Anda menggunakan metode trace pada StringVar Anda, atau menggunakan validcommand pada entri Anda. Anda dapat membaca detail tentang cara menggunakan kedua metode di sini dan di sini

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()

Untuk pertanyaan kedua Anda, saya tidak sepenuhnya memahami apa yang ingin Anda capai, tetapi jika masalahnya terletak pada pengikatan dengan kunci f, saya kira Anda cukup memanggil game.unbind('f') di fungsi submit Anda.

person Henry Yik    schedule 13.04.2019