限制tk小部件的输入

时间:2012-07-15 10:28:33

标签: python regex tkinter python-2.7

我很难找到一种方法来限制条目小部件的输入长度,我想将它限制为20个字符,即当我点击一个序列或另一个我希望能够编辑它但留在20个字符的限制。为了使代码保持清晰,我应该使用正则表达式,循环还是使用事件检查条目?

这是我的代码:

import Tkinter
from Tkinter import *
import tkFileDialog

root = Tkinter.Tk()

edit1    =StringVar()
edit2    =StringVar()
s = StringVar()


s = "GATACACGCGCGCGTATATATTACGCGCGCGATACA"



lb01=Label(root,text="sequence1")
lb01v=Entry(root,textvariable=edit1,width=20)
lb01v.delete(0, END)
lb01v.insert(0, s[6:20])

lb01.grid(sticky=W,row=1,column=1)
lb01v.grid(row=1,column=2)


lb02=Label(root,text="sequence2")
lb02v=Entry(root,textvariable=edit2,width=20)
lb02v.delete(0, END)
lb02v.insert(0, s[0:6])

lb02.grid(sticky=W,row=2,column=1)
lb02v.grid(row=2,column=2)

root.mainloop()

4 个答案:

答案 0 :(得分:2)

好的,我尝试使用跟踪变量,在一小段测试代码上,这正是我所寻找的!我喜欢你可以在Python中轻松制作原型的事实;)

def main():
    pass

if __name__ == '__main__':
    main()

from Tkinter import *

def callback(sv):
    c = sv.get()[0:9]
    print "c=" , c
    sv.set(c)

root = Tk()
sv = StringVar()
sv.trace("w", lambda name, index, mode, sv=sv: callback(sv))
e = Entry(root, textvariable=sv)
e.pack()
root.mainloop()

答案 1 :(得分:1)

最简单的解决方案是对变量进行跟踪。触发跟踪时,检查值的长度,然后删除超出限制的任何字符。

如果你不喜欢这个解决方案,Tkinter还有内置的工具来对入口小部件进行输入验证。这是Tkinter的一个有点未记录的功能。有关示例,请参阅问题my answer

Python/Tkinter: Interactively validating Entry widget content

答案 2 :(得分:1)

我知道添加任何答案为时已晚,只是找到了一种简单的方式来表示Wabara的回答。如果您需要多个输入限制,并且每个限制为用户定义的长度限制,这将有所帮助。这是在Python 3.6.5上运行的代码:

def main():
    pass

if __name__ == '__main__':
    main()

from tkinter import *

def limit_entry(str_var,length):
    def callback(str_var):
        c = str_var.get()[0:length]
        str_var.set(c)
    str_var.trace("w", lambda name, index, mode, str_var=str_var: callback(str_var))

root = Tk()

abc = StringVar()
xyz = StringVar()

limit_entry(abc,3)
limit_entry(xyz,5)

e1 = Entry(root, textvariable=abc)
e2 = Entry(root, textvariable=xyz)

e1.pack()
e2.pack()
root.mainloop()

答案 3 :(得分:-2)

我将从制作字母表开始。字母表是一个字符串,有26个字母,意味着它太长,不适合我们使用。我们只想要20个字母,所以我们的输出应该是" A"通过" T"只要。 我将定义一个函数来实现它,并通过它转储每个字符串,我希望切割到20个字符或更少。 我正在以下这样的方式制作下面的代码,它将任何被称为输入的字符串作为输入,并将其处理为长度仅为20个字符...

def twenty(z):
    a = z[0:20]
    return a

alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

所以为了执行我们新创建的代码,我们只需要在括号中调用print twenty命令和我们想要剪切为20个字符的变量。

print twenty(alphabet)

-----------------------------------------------------------------
OUTPUT:
ABCDEFGHIJKLMNOPQRST

所以你看,它有效,我们将整个字母输入到程序中,它只将字符串减少到20个字母。现在每次在你的代码中你想要将文本剪切成20个字母,只需运行命令即可     20(可变) 它会确保你没有更多的信件。

说明: def 20是用一个输入定义一个函数,只需输入二十(变量)即可反复调用 下一行是a = z [0:20]含义调用变量" a"等于从位置0到位置20的输入,不要担心过去的任何事情。 return命令是如何从def函数获得输出的。无论何时创建def函数,都应该用一行来结束它。