[英]ttk Entry widget - validate entry - invalid text entry does not cause reverting to previous text
Python 3.1
我正在嘗試驗證輸入到ttk.Entry小部件的字符串是否可以轉換為浮點型。 下面的簡單代碼顯示validate函數已成功完成任務,並且正確返回了true / false。
據我了解,如果Entry小部件從validate命令返回“ false”,它應該恢復為嘗試輸入之前在textvariable中存儲的內容。
但這並沒有發生-即使無效,也會出現新條目。
想必我想念一些愚蠢的東西...
from tkinter import *
from tkinter.ttk import *
root = Tk()
text = StringVar()
text.set('100.0')
def validate(inp):
print(inp)
if inp in '0123456789.-+':
try:
float(inp)
print('float')
return True
except ValueError:
print('notfloat')
return False
else:
print('notfloat')
return False
vcmd = root.register(validate)
a = Entry(textvariable = text,
validate = 'focusout',
validatecommand = (vcmd,'%P'))
a.pack()
b = Entry()
b.pack()
root.mainloop()
請嘗試以下操作:
from tkinter import *
from tkinter.ttk import *
root = Tk()
text = StringVar()
text.set('100.0')
def validate(inp):
try:
float(inp)
except ValueError:
return False
return True
vcmd = root.register(validate)
a = Entry(textvariable=text,
validate='key',
validatecommand=(vcmd, '%P'))
a.pack()
b = Entry()
b.pack()
root.mainloop()
我改用validate='key'
。
並替換了validate
功能。 a in b
支票串a
中所含的b
。
>>> '100.00' in '0123456789.-+'
False
>>> '100.00' in 'blah blah 100.00 blah blah'
True
替代
使用focusout
:
from tkinter import *
from tkinter.ttk import *
root = Tk()
text = StringVar()
text.set('100.0')
last_ok_value = text.get()
def validate(inp):
global last_ok_value
try:
float(inp)
except ValueError:
return False
last_ok_value = inp
return True
def invalidate():
text.set(last_ok_value)
vcmd = root.register(validate)
ivcmd = root.register(invalidate)
a = Entry(textvariable=text,
validate='focusout',
validatecommand=(vcmd, '%P'),
invalidcommand=(ivcmd,))
a.pack()
b = Entry()
b.pack()
root.mainloop()
使用類:
from tkinter import *
from tkinter.ttk import *
class FloatEntry(Entry):
def __init__(self, *args, **kwargs):
initial_value = kwargs.pop('initial_value', '100.00')
assert self.validate(initial_value), 'Invalid initial_value given'
self.last_valid_value = initial_value
self.text = StringVar(value=initial_value)
Entry.__init__(self, *args, textvariable=self.text, **kwargs)
self.vcmd = self.register(self.validate)
self.ivcmd = self.register(self.invalidate)
self['validate'] = 'focusout'
self['validatecommand'] = self.vcmd, '%P',
self['invalidcommand'] = self.ivcmd,
def validate(self, inp):
try:
float(inp)
except ValueError:
return False
self.last_valid_value = inp
return True
def invalidate(self):
self.text.set(self.last_valid_value)
root = Tk()
FloatEntry(initial_value='100.0').pack()
Entry().pack()
root.mainloop()
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.