Найти - Пользователи
Полная версия: Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.
Начало » GUI » Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.
1
v3_62
Добрый день.
Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.
Пытаюсь написать процедуру ввода по шаблону на примере сотового телефона.
Если нет выделения в строке, то все более менее работает,
иначе получается не очень красиво.
 # -*- coding: utf-8 -*-
import tkinter as tk
from tkinter import ttk
def validate( action, index, value_if_allowed,
             prior_value, text, validation_type, trigger_type, widget_):
    index = int(index)
    #print(index, text)
    if int(action) == 0: # Удалили символ
        if template[index] == '_': # Меняем число на _
            var_stl.set(prior_value[0:index] + '_' + prior_value[index+1:])
        entry_stl.icursor(index)
        return False
    elif index > len(template[:-1]) :
        return False
    elif text == template[index]:
        entry_stl.icursor(index + 1)
    elif text in '0123456789':
        if template[index] != '_':
            for i, t in enumerate(template[index + 1:]):
                if t == '_':
                    break
            index += i + 1
        value_ = prior_value[0:index] + text + prior_value[index+1:]
        var_stl.set(value_)
        index += 1
        if index < len(template):
            if template[index] != '_':
                for i, t in enumerate(template[index:]):
                    if t == '_':
                        index = index + i
                        break
        entry_stl.icursor(index)
        return True
    return False
if __name__ == '__main__':
    template = '8 (___) ___ __ __'
    root = tk.Tk()
    var_stl = tk.StringVar()
    var_stl.set(template)
    vcmd = (root.register(validate),
            '%d', '%i', '%P', '%s', '%S', '%v', '%V', '%W')
    entry_stl = ttk.Entry(root, textvariable=var_stl, width=20,
                          validate='key', validatecommand=vcmd,
                          font=('Helvetica', 20, 'bold'))
    entry_stl.pack()
    root.mainloop()
rami
В функции validate в самой первой строке напишите entry_stl.selection_clear().
v3_62
rami
В функции validate в самой первой строке напишите entry_stl.selection_clear().

Спасибо, написал, работает :)
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB