Уведомления

Группа в Telegram: @pythonsu
  • Начало
  • » GUI
  • » Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования. [RSS Feed]

#1 Фев. 11, 2018 19:25:25

v3_62
От:
Зарегистрирован: 2010-02-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.

Добрый день.
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()



Отредактировано v3_62 (Фев. 12, 2018 03:13:43)

Прикреплённый файлы:
attachment entry_python_su.py (1,7 KБ)

Офлайн

#2 Фев. 12, 2018 07:18:23

rami
Зарегистрирован: 2018-01-08
Сообщения: 280
Репутация: +  71  -
Профиль   Отправить e-mail  

Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.

В функции validate в самой первой строке напишите entry_stl.selection_clear().

Офлайн

#3 Фев. 12, 2018 07:58:55

v3_62
От:
Зарегистрирован: 2010-02-10
Сообщения: 15
Репутация: +  0  -
Профиль   Отправить e-mail  

Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.

rami
В функции validate в самой первой строке напишите entry_stl.selection_clear().

Спасибо, написал, работает :)



Офлайн

  • Начало
  • » GUI
  • » Tkinter, ttk, Entry. Как в <validate>, определить и отменить выделение текста в строке редактирования.[RSS Feed]

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version