11tadpole 发表于 2022-5-13 16:38:02

tkinter Entry的验证函数验证次数有限

35讲easygui的课后作业改成用tkinter来实现,写了一个验证输入有效性的函数,但发现验证结果没有按照预期进行
在输入符合要求的数字后,按BackSpace删除第一个数字时,会返回False,在这之后不管输入什么,entry组件都不再有验证功能
我并不希望删除之前的数字更换为新数字时报错,是否有好的解决办法?之后不再进行数据验证的原因是什么?
from tkinter import *
import tkinter.messagebox
import random

secret = random.randint(1,10)

root = Tk()
root.title('数字小游戏')

def test(content):
    if not content.isdigit():
      tkinter.messagebox.showerror(message='请输入数字!')
      print('1')
      return False
    elif int(content)>10 or int(content)<1:
      tkinter.messagebox.showerror(message='请输入1-10的数字!')
      print('2')
      return False
    else:
      print('3')
      return True

def speculate():
    if int(guess.get()) == secret:
      tkinter.messagebox.showinfo(message='正确!数字为:'+str(secret))
    else:
      if int(guess.get()) > secret:
            tkinter.messagebox.showinfo(message='大了')
      else:
            tkinter.messagebox.showinfo(message='小了')

def clearAll():
    e1.delete(0,END)

Label(root, text='不妨猜下 小甲鱼现在心里想的是哪个数字(1-10):').grid(row=0, column=0,columnspan=2, padx=5,pady=5)

guess = StringVar()
testCMD = root.register(test)
e1 = Entry(root, textvariable=guess, validate='key', validatecommand=(testCMD, '%P'), invalidcommand=clearAll, width=50)
e1.grid(row=1,column=0,columnspan=2,padx=10,pady=10)

Button(root, text='OK', command=speculate).grid(row=2, column=0)
Button(root, text='Cancel').grid (row=2, column=1,padx=5,pady=5)

root.mainloop()

ba21 发表于 2022-5-13 19:02:46

该 功能不完善。
直接改用 事件 来处理吧。

11tadpole 发表于 2022-5-26 20:52:23

自己顶一下

鱼cpython学习者 发表于 2022-5-29 18:07:14

我在本地运行了你的代码,并没有发现你说的不能验证问题。至于删除报错的问题,我发现是因为Backspace会发送一个空字符串给test函数,具体原因不知道。你只需在test函数中加入判空就行
页: [1]
查看完整版本: tkinter Entry的验证函数验证次数有限