tkinter: перемещение фокуса на следующий виджет, когда входной виджет заполнен, не теряя нажатия клавиш - PullRequest
1 голос
/ 07 февраля 2020

это мой первый вопрос здесь, так что извините, если я делаю что-то не так.

Я создаю класс записи, который будет проверять длину ввода, а затем фокусировать следующий виджет. Приведенный ниже код делает это, но он вызывает изменение фокуса на нажатии клавиши ПОСЛЕ нужной длины, что приводит к потере этого нажатия

Пример: если вы введете 123456789 в первое поле ввода, конечный результат будет 1234 в поле ввода 1 и 6789 в поле ввода 2

import tkinter as tk

class ValidateEntry(tk.Frame):

    def __init__(self, parent, width=20, txt=None): 
        tk.Frame.__init__(self, parent)
        self.width = width
        vcmd = (self.register(self.validate), '%i', '%S', '%d', '%P')
        self.entry = tk.Entry(self, width=self.width, validate='key', vcmd=vcmd)
        if txt is not None:
            self.entry.insert('end', txt)
        self.entry.pack()

    def validate(self, i, S, d, P):# i = index, S = insert character, d = action, P = entry value
        if len(P)-1 == self.width and d != 0:
            self.entry.tk_focusNext().focus()
            return False
        return True

root = tk.Tk()
entry1 = ValidateEntry(root, width=4)
entry2 = tk.Entry(root, width=8)
entry1.pack()
entry2.pack()
root.mainloop()

Я не могу найти способ изменить фокус и удерживать нажатой 5-ю клавишу в примере выше

1 Ответ

1 голос
/ 07 февраля 2020

При четвертом нажатии клавиши вы хотите принять клавишу (поэтому верните true) и изменить фокус. поэтому просто измените функцию проверки на:

def validate(self, i, S, d, P):# i = index, S = insert character, d = action, P = entry value
    if len(P) == self.width and d != 0:
        self.entry.tk_focusNext().focus()
    return True
...