Как принять только два числа в поле Texinput? - PullRequest
0 голосов
/ 10 июля 2019

Я хочу принять только два числа в моем Textinput. Я знаю, как принимать только цифры, и я знаю, как принимать только две буквы, но не знаю, как сделать обе.

Этот код принимают только буквы:

TextInput:
    multiline: False
    input_filter: lambda text, from_undo: text[:2 - len(self.text)]

И этот код принимает только цифры:

TextInput:
    multiline: False
    input_filter: "int"

Но когда я пытаюсь что-то вроде:

TextInput:
    multiline: False
    input_filter: "int", lambda text, from_undo: text[:2 - 
    len(self.text)]

Я получаю эту ошибку:

TypeError: 'tuple' object is not callable

1 Ответ

0 голосов
/ 10 июля 2019

Насколько я знаю, вы не можете делать то, что вы хотите таким образом.Но вы можете использовать NumericInput , этот класс будет использовать TextInput и обрабатывать ваши ограничения.Я надеюсь, что это может помочь вам. Это немного отличается от вашей первоначальной идеи, но решает проблему.

Поэтому попробуйте выполнить следующее:

main.py file

from kivy.app import App
from kivy.base import Builder
from kivy.properties import NumericProperty
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.screenmanager import ScreenManager


class NumericInput(TextInput):
    min_value = NumericProperty(None)
    max_value = NumericProperty(None)

    def __init__(self, *args, **kwargs):
        TextInput.__init__(self, *args, **kwargs)
        self.input_filter = 'int' # The type of your filter
        self.multiline = False

    def insert_text(self, string, from_undo=False):
        new_text = self.text + string

        if new_text != "" and len(new_text) < 3:
            try:
                # Will try convert the text to a int and compare, if it's not a number
                # It will throw a exception and will not append the text into the input

                # If the value is between the values and is a int
                if self.min_value <= int(new_text) <= self.max_value:
                    TextInput.insert_text(self, string, from_undo=from_undo)
            except ValueError as e: # Just cannot convert to a `int`
                pass



class BoundedLayout(BoxLayout):
    pass


presentation = Builder.load_file("gui.kv")
class App(App):
    def build(self):
        return BoundedLayout()

if __name__ == '__main__':
    App().run()

файл gui.kv

#:kivy 1.0

<BoundedLayout>:
  orientation: 'horizontal'
  Label:
    text: 'Value'
  NumericInput:
    min_value : 0 # your smaller value, can be negative too
    max_value : 99 # Here goes the max value
    hint_text : 'Enter values between {} and {}'.format(self.min_value, self.max_value)
...