限制Tkinter Entry小部件中的值

sig*_*980 10 python validation tkinter

我需要将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()
Run Code Online (Sandbox Code Playgroud)

我不断收到Event实例没有属性'int'的错误消息.我该怎么办?

unu*_*tbu 18

这用于validatecommand限制tk.Entryto字符中的有效用户输入validate,并检查输入是否可以解释为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 value_if_allowed:
            try:
                float(value_if_allowed)
                return True
            except ValueError:
                return False
        else:
            return False

root1 = tk.Tk()
window2(root1)
root1.mainloop()
Run Code Online (Sandbox Code Playgroud)

参考文献:


Ern*_*ers 8

我知道要回答这个问题已经很晚了,但是我觉得我可以给出一个更简单的答案……一旦您了解了它的工作原理,它就非常简单。

使用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
Run Code Online (Sandbox Code Playgroud)

您不需要包括所有替换代码:('%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W'),只需要使用那些替换代码

Entry控件返回一个字符串,那么你将不得不以他们的其他字符分开莫名其妙地提取任何数字。最简单的方法是使用str.isdigit()。这是内置在python库中的便捷小工具,不需要额外的导入,它将标识从小部件返回的字符串中找到的任何数字(数字)Entry

or P == ""if语句的一部分允许您删除整个条目,如果没有它,由于'%P'返回一个空值并导致您的回调返回,因此您将无法删除最后一位(输入框的第一位)False。我不会在这里详述。

validate='all'允许回调函数评估Pas 的值focusinfocusout或者在任何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到所需的任何变量中。


小智 6

答案几乎是完美的,只需添加一点即可删除整个字符串。仅在插入文本时才应检查浮点数

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
Run Code Online (Sandbox Code Playgroud)