我正在开发一个 tkinter 应用程序,该应用程序具有一个条目小部件和一种在用户在其中键入内容时对其进行验证的方法。问题是 <Key> 绑定在self.entry_str
更新之前运行验证方法,因此它测试条目中以前的内容。我想要它做的是在self.entry_str
更新后运行验证方法,有人知道我该怎么做吗?这是简化的程序:
import sys
import tkinter as tk
class GUI:
def __init__(self, master):
# frame
self.frame = tk.Frame(master)
self.frame.pack()
# StringVars
self.error = tk.StringVar()
self.error.set('')
self.entry_str = tk.StringVar()
self.entry_str.set('')
# widgets
self.entry = tk.Entry(self.frame, textvariable=self.entry_str)
self.entry.bind('<Key>', lambda _: self.validate_entry())
self.entry.grid(row=0, column=0)
self.error_label = tk.Label(self.frame, textvariable=self.error, fg='red')
self.error_label.grid(row=1, column=0)
self.bttn = tk.Button(self.frame, text='continue', command=sys.exit)
self.bttn.grid(row=2, column=0)
def validate_entry(self):
try:
_ = int(self.entry_str.get())
except ValueError:# entry is not valid: disable button and show error
self.error.set('entry has to be an integer')
self.bttn.config(state='disabled')
else:# entry is valid: enable button and hide error
self.error.set('')
self.bttn.config(state='normal')
root = tk.Tk()
gui = GUI(root)
root.wm_title('entry validation test')
root.mainloop()
使用<KeyRelease>
代替<Key>
更好的方法是使用 .trace
self.entry_str = tk.StringVar()
self.entry_str.set('')
self.entry_str.trace('w', self.validate_entry)
...
def validate_entry(self, *event):
try:
_ = int(self.entry_str.get())
...
另一种方法是禁止用户输入除整数以外的任何内容。
self.entry = tk.Entry(self.frame, textvariable=self.entry_str, validate='key', validatecommand=(master.register(self.validate), "%P"))
...
def validate(self, char): # this function must return only True or False
return char.isdigit() or char==''
请注意self.entry_str
将始终是最新的
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句