Текстовое поле Tkinter с ограниченным количеством доступных символов - PullRequest
2 голосов
/ 28 июня 2011

Я работаю над приложением для редактирования последовательностей ДНК, и я хотел бы иметь текстовый виджет tkinter, в который можно вводить только буквы atgcATGC.

Есть ли простой способ сделать это?

Спасибо, David

Ответы [ 4 ]

2 голосов
/ 01 июля 2011

Я наконец нашел способ получить именно то поведение, которое хочу:

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 голосов
/ 28 июня 2011

Вы можете использовать функцию validatecommand виджета Entry.Лучшая документация, которую я могу найти - этот ответ на аналогичный вопросСледуя этому примеру,

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 голос
/ 28 июня 2011

Вам нужно будет отловить событие "<Key>" в виджете, где вы вводите текст.Затем вы можете просто отфильтровать

if key.char and key.char not in "atgcATGC":
    return "break"

Вот некоторая информация об обработке событий в tkinter: http://effbot.org/tkinterbook/tkinter-events-and-bindings.htm

0 голосов
/ 28 июня 2011

Я бы порекомендовал набор инструментов Pmw , который предоставляет Tkinter множество полезных дополнений.Класс Pmw EntryField позволяет вам написать произвольный валидатор для любого текстового поля.Pmw легок и очень удобен, если вы разрабатываете что-то для Tkinter, вы, вероятно, найдете его полезными.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...