限制Tkinter Entry小部件中的值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了限制Tkinter Entry小部件中的值相关的知识,希望对你有一定的参考价值。
我需要将Entry小部件中的值限制为仅限数字。我实施的方式是:
import numpy as np
from Tkinter import *;
import tkMessageBox;
class window2:
def __init__(self,master1):
self.panel2=Frame(master1)
self.panel2.grid()
self.button2=Button(self.panel2,text="Quit",command=self.panel2.quit)
self.button2.grid()
self.text1=Entry(self.panel2)
self.text1.grid()
self.text1.bind('<KeyPress>', self.keybind1)
self.text1.focus()
def keybind1 (self,event):
if event.int in np.linspace(0,9,10):
print event.int
root1=Tk()
window2(root1)
root1.mainloop()
我不断收到Event实例没有属性'int'的错误消息。我该怎么办?
这使用validatecommand
将tk.Entry
中的有效用户输入限制为'0123456789.-+'
中的字符,并检查输入是否可以解释为float:
import Tkinter as tk
class window2:
def __init__(self, master1):
self.panel2 = tk.Frame(master1)
self.panel2.grid()
self.button2 = tk.Button(self.panel2, text = "Quit", command = self.panel2.quit)
self.button2.grid()
vcmd = (master1.register(self.validate),
'%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
self.text1 = tk.Entry(self.panel2, validate = 'key', validatecommand = vcmd)
self.text1.grid()
self.text1.focus()
def validate(self, action, index, value_if_allowed,
prior_value, text, validation_type, trigger_type, widget_name):
if text in '0123456789.-+':
try:
float(value_if_allowed)
return True
except ValueError:
return False
else:
return False
root1 = tk.Tk()
window2(root1)
root1.mainloop()
参考文献:
- Tk man page解释了
validate
和validatecommand
选项。 (感谢schlenk的链接)。 - 我在Python here中学会了如何做到这一点。
我意识到这个答案已经很晚了,但觉得我可以给出更简单的答案......一旦你理解了它的工作方式,这真的很简单。
使用Entry
小部件附带的验证功能。
让我们假设self
是一个小部件:
vcmd = (self.register(self.callback))
w = Entry(self, validate='all', validatecommand=(vcmd, '%P'))
w.pack()
def callback(self, P):
if str.isdigit(P) or P == "":
return True
else:
return False
您不需要包含所有替换代码:('%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'
),只需要您使用的代码。
Entry
小部件返回一个字符串,因此您必须以某种方式提取任何数字,以便将它们与其他字符分开。最简单的方法是使用str.isdigit()
。这是一个内置于python库中的方便的小工具,不需要额外的导入,它将识别它从Entry
小部件返回的字符串中找到的任何数字(数字)。
if语句的or P == ""
部分允许你删除你的整个条目,没有它,你将无法删除最后一个(输入框中的第一个)数字,因为'%P'
返回一个空值并导致你的回调返回False
。我不会在这里详细说明原因。
validate='all'
允许回调评估P
的值,因为你focusin
,focusout
或任何key
笔划改变小部件中的内容,因此你不会留下任何漏洞,以便错误地输入杂散字符。
总之,要简单化。如果你的回调返回True
,它将允许输入数据。如果回调返回'False',它将基本上'忽略'键盘输入。
看看这两个参考文献。他们解释了每个替换代码的含义以及如何实现它们。
http://infohost.nmt.edu/tcc/help/pubs/tkinter/web/entry-validation.html http://stupidpythonideas.blogspot.ca/2013/12/tkinter-validation.html
编辑:这只会照顾框中允许的内容。但是,您可以在回调中添加P
对您希望的任何变量的任何值。
答案几乎是完美的,只是一点点添加,允许删除整个字符串。只有在插入文本时才应检查浮点数
def validate_float(self, action, index, value_if_allowed,
prior_value, text, validation_type, trigger_type, widget_name):
# action=1 -> insert
if(action=='1'):
if text in '0123456789.-+':
try:
float(value_if_allowed)
return True
except ValueError:
return False
else:
return False
else:
return True
我不得不处理一个初始插入案例。这就是我最终得到的结果:
def _checkNumberOnly(self, action, value_if_allowed):
if action != '1':
return True
try:
return value_if_allowed.isnumeric()
except ValueError:
return False
vcmd = (self.register(self._checkNumberOnly), '%d', '%P')
self.port = ttk.Entry(self, width=35, validate='key', validatecommand=vcmd)
因此它验证以下内容:
self.port.insert(0, '6379')
我不确定是否需要捕获,因为isnumeric()
没有说它会引发异常。
我是python和Tkinter的新手,但这对我来说效果最好:
def keybind1 (self,event):
v = event.char
try:
v = int(v)
except ValueError:
if v!="x08" and v!="":
return "break"
v = int(v)
触发ValueError
除了数字键以外的任何键,if v!="x08
和v!="":"
语句仍允许退格,("x08")
和删除,箭头,home,end等键,(有event.char
的""
)工作一般。 break
命令停止将不需要的字符输入Entry框。
以上是关于限制Tkinter Entry小部件中的值的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 tkinter 中的按钮设置“Entry”小部件的文本/值/内容