Как исправить проверку tkinter (используя regex и vcmd) - PullRequest
0 голосов
/ 23 сентября 2019

Этот код является фрагментом программы.Я попытался сделать систему, которая проверяет ввод, только если ввод - одно или несколько чисел (r "^ \ d + $").Но это не работает, я проверяю свою ссылку на книгу tkinter, но я не нашел ошибок.Я разработал его, используя функцию vcmd, которая передает значение («% P»), вызывая функцию, которая проверяет значение.Когда он запускает метод match модуля regex, если он соответствует значению в pattern, он получает True, в противном случае - False.Если «Ложь», я хочу, чтобы невидимый текст не отображался в виджете «Ввод», если «Истина», я хочу, чтобы числовой текст отображался в виджете «Ввод».Более того, он не запускает функцию invalidcommand, и я попытался узнать, сколько раз запускается проверяющая функция (только в первый раз).

import tkinter
import re as regex
from electronic_formulas import Electronic


class App(tkinter.Tk):

def __init__(self):
    super().__init__()

    self.var_r1 = tkinter.DoubleVar()
    self.var_r2 = tkinter.DoubleVar()

    self.pattern = regex.compile(r"^[0-9]+$")
    vcmd = (self.register(self.validating_values), "%P")

    self.frame_left = tkinter.Frame(self)
    self.frame_left.pack(side=tkinter.LEFT)
    self.frame_right = tkinter.Frame(self)
    self.frame_right.pack(side=tkinter.RIGHT)

    self.entry_r1 = tkinter.Entry(self.frame_left, textvariable=self.var_r1, validate="key",
                                  validatecommand=vcmd, invalidcommand=lambda: print("Error"))
    self.entry_r1.pack(side=tkinter.TOP)

    self.entry_r2 = tkinter.Entry(self.frame_left, textvariable=self.var_r2, validate="key",
                                  validatecommand=vcmd, invalidcommand=lambda: print("Error"))
    self.entry_r2.pack(side=tkinter.TOP)

    self.var_r1.set("")
    self.var_r2.set("")

def validating_values(self, value):
    return self.pattern.match(value) is not None


app = App()

if __name__ == "__main__":
app.mainloop()

Нет ошибок tcl.

1 Ответ

1 голос
/ 24 сентября 2019

Есть две проблемы:

  • вы установили значение равным DoubleVar, но тогда вы не допустите десятичную точку.
  • ваша функция проверки не допускает пустую строку, но затем вы устанавливаете значение в пустую строку.

Это то, что каноническая документация tcl / tk говорит о смешивании validatecommand с textvariable:

В общем случае textVariable и validateCommand могут быть опасны для смешивания.Все проблемы были преодолены, поэтому использование validateCommand не будет мешать традиционному поведению виджета ввода.Использование textVariable только для чтения никогда не вызовет проблем.Опасность возникает, когда вы пытаетесь установить для textVariable значение, которое validateCommand не примет, что приводит к тому, что validate становится равным none (invalidCommand не будет запущен).То же самое происходит, когда при оценке validateCommand возникает ошибка.

Вы делаете именно это: устанавливаете переменную text в то, что validatecommand не примет.Как следствие, опция validate установлена ​​на None.

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