Tkinter文本字段,可用字符数量有限

时间:2011-06-28 17:55:41

标签: python tkinter

我正在开发一个编辑DNA序列的应用程序,我想要一个tkinter文本小部件,其中只能输入字母atgcATGC。

有没有简单的方法呢?

谢谢, 大卫

4 个答案:

答案 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中开发任何东西,你可能会发现它的功能很有用。