Сбой проверки записи при замене пробелов на пустые строки - PullRequest
0 голосов
/ 24 февраля 2020

Я не уверен, почему проверка перестает работать после замены пробелов в строке. Проверка работает нормально для большинства вещей, которые мне нужны. Он допускает только цифры и до 10 из них, а также позволяет оставить пробелы и выделить все и расстояние между ними. Он также работает один раз при вставке значений, которые содержат пробелы.

Например, если я попытаюсь вставить 12 34 в поле ввода, это правильно изменит значение на 1234, но после этого проверка просто перестает работать.

Обновление:

Кажется, что проверка перестает работать после entry.delete(), хотя я все еще не уверен, как это исправить. Я пытался переопределить валидацию, но это не сработало.

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.vcmd = (self.register(self.validate), '%d', '%P', '%s')
        self.entry = tk.Entry(self, validate='key', validatecommand=self.vcmd)
        self.entry.pack()

    def validate(self, *a):
        b = a[1].replace(' ', '')
        if b.isdigit() and len(b) <= 10 or ((b == '' or b < a[2]) and a[0] == '0'):
            if ' ' in a[1]:
                x = a[1]
                x = x.replace(' ', '')
                self.entry.delete(0, 'end')
                self.entry.insert(0, x)
            return True

        else:
            return False

App().mainloop()

Обновление:

Мне удалось заставить его работать, удалив поле ввода и переопределив его и его валидацию после вставки новая строка Но это кажется неправильным способом сделать это.

import tkinter as tk


class App(tk.Tk):
    def __init__(self):
        super().__init__()
        self.vcmd = (self.register(self.validate), '%d', '%P', '%s')
        self.entry = tk.Entry(self, validate='key', validatecommand=self.vcmd)
        self.entry.pack()

    def validate(self, *a):
        b = a[1].replace(' ', '')
        if b.isdigit() and len(b) <= 10 or ((b == '' or b < a[2]) and a[0] == '0'):
            if ' ' in a[1]:
                x = a[1]
                x = x.replace(' ', '')
                self.entry.destroy()
                self.entry = tk.Entry(self)
                self.entry.insert(0, x)
                self.entry.config(validate='key', validatecommand=self.vcmd)
                self.entry.pack()
            return True
        else:
            return False

App().mainloop()

1 Ответ

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

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

Она перестает работать, потому что именно так она и работает. Если вы попытаетесь изменить данные из функции проверки, опция validate автоматически сбрасывается на "none".

Это то, что говорится в официальной документации tcl / tk:

Параметр validate также будет установлен на none при редактировании виджета ввода изнутри validateCommand или invalidCommand.

Вам понадобится сбросить параметр validate в случае, когда вы изменяете виджет из функции проверки.

...