我正在开发一个编辑DNA序列的应用程序,我想要一个tkinter文本小部件,其中只能输入字母atgcATGC。
有没有简单的方法呢?
谢谢, 大卫
答案 0 :(得分:2)
您可以使用validatecommand
小部件的Entry
功能。我能找到的最好的文档是this answer类似的问题。按照这个例子,
import Tkinter as tk
class MyApp():
def __init__(self):
self.root = tk.Tk()
vcmd = (self.root.register(self.validate), '%S')
self.entry = tk.Entry(self.root, validate="key",
validatecommand=vcmd)
self.entry.pack()
self.root.mainloop()
def validate(self, S):
return all(c in 'atgcATGC' for c in S)
app=MyApp()
答案 1 :(得分:2)
我终于找到了一种方法来获得我想要的确切行为:
from Tkinter import Text, BOTH
import re
class T(Text):
def __init__(self, *a, **b):
# Create self as a Text.
Text.__init__(self, *a, **b)
#self.bind("<Button-1>", self.click)
self.bind("<Key>", self.key)
self.bind("<Control-v>", self.paste)
def key(self,k):
if k.char and k.char not in "atgcATGC":
return "break"
def paste(self,event):
clip=self.selection_get(selection='CLIPBOARD')
clip=clip.replace("\n","").replace("\r","")
m=re.match("[atgcATGC]*",clip)
if m and m.group()==clip:
self.clipboard_clear()
self.clipboard_append(clip)
else:
self.clipboard_clear()
return
t = T()
t.pack(expand=1, fill=BOTH)
t.mainloop()
答案 2 :(得分:1)
您必须在您输入文字的小部件上捕捉"<Key>"
事件。然后你可以过滤
if key.char and key.char not in "atgcATGC":
return "break"
以下是关于在tkinter中处理事件的一些信息:http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm
答案 3 :(得分:0)
我会推荐Pmw工具包,它为Tkinter提供了许多方便的附加功能。 Pmw EntryField类允许您为任何文本字段编写任意验证器。 Pmw是轻量级的,非常实用,如果你在Tkinter中开发任何东西,你可能会发现它的功能很有用。