Kivy - 文本输入



在桌面和 Web 应用程序中,您经常会看到一个矩形框,供用户输入一些文本。文本框是任何 GUI 工具包中必不可少的部件。在 Kivy 中,TextInput 提供了一个控件,用户可以在其中输入和编辑文本。

TextInput 控件可以自定义为接收单行或多行文本。可以使用鼠标选择文本的某一部分。还可以使用光标移动在其中执行全屏编辑。

TextInput 类定义在 kivy.uix.textinput 模块中。

from kivy.uix.textinput import TextInput
textbox = TextInput(**kwargs)

TextInput 类中定义了以下属性:

  • allow_copy - 决定是否允许复制文本。allow_copy 是一个 BooleanProperty,默认为 True。

  • background_color - 背景的当前颜色,格式为 (r, g, b, a)。它是一个 ColorProperty,默认为 [1, 1, 1, 1](白色)。

  • border - 用于 BorderImage 图形指令的边框。与 background_normal 和 background_active 一起使用。可用于自定义背景。它必须是一个包含四个值的列表:(bottom, right, top, left)。border 是一个 ListProperty,默认为 (4, 4, 4, 4)。

  • cursor - 指示当前光标位置的 (col, row) 值元组。如果要移动光标,可以设置新的 (col, row)。滚动区域将自动更新,以确保光标在视口中可见。cursor 是一个 AliasProperty。

  • cursor_color - 光标的当前颜色,格式为 (r, g, b, a)。cursor_color 是一个 ColorProperty,默认为 [1, 0, 0, 1]。

  • cut() - 将当前选择复制到剪贴板,然后将其从 TextInput 中删除。

  • delete_selection(from_undo=False) - 删除当前文本选择(如果有)。

  • disabled_foreground_color - 禁用时前景色当前颜色,格式为 (r, g, b, a)。disabled_foreground_color 是一个 ColorProperty,默认为 [0, 0, 0, 5](50% 透明黑色)。

  • font_name - 要使用的字体的文件名。路径可以是绝对路径或相对路径。相对路径由 resource_find() 函数解析。

  • font_name - 是一个 StringProperty,默认为 'Roboto'。此值取自 Config。

  • font_size - 文本的字体大小(以像素为单位)。font_size 是一个 NumericProperty,默认为 15 sp。

  • foreground_color - 前景的当前颜色,格式为 (r, g, b, a)。oreground_color 是一个 ColorProperty,默认为 [0, 0, 0, 1](黑色)。

  • halign - 文本的水平对齐方式。halign 是一个 OptionProperty,默认为 'auto'。可用选项为:auto、left、center 和 right。

  • hint_text - 部件的提示文本,如果文本为空则显示。hint_text 是一个 AliasProperty,默认为 ''。

  • hint_text_color - 提示文本 hint_text 的当前颜色,格式为 (r, g, b, a),ColorProperty 默认为 [0.5, 0.5, 0.5, 1.0](灰色)。

  • input_filter - 根据指定的模式过滤输入,如果非 None。如果为 None,则不应用任何过滤。它是一个 ObjectProperty,默认为 None。可以是 None、'int'(字符串)、'float'(字符串)或可调用对象。

  • insert_text(substring, from_undo=False) - 在当前光标位置插入新文本。覆盖此函数以预处理文本进行输入验证。

  • line_height - 一行的高度。此属性会根据 font_name 和 font_size 自动计算。更改 line_height 将不会产生任何影响。line_height 是一个 NumericProperty,只读。

  • line_spacing - 行间距。line_spacing 是一个 NumericProperty,默认为 0。

  • minimum_height - TextInput 内部内容的最小高度。minimum_height 是一个只读的 AliasProperty。

  • multiline - 如果为 True,则部件将能够显示多行文本。如果为 False,则“Enter”键按下将使文本输入失去焦点,而不是添加新行。

  • on_touch_down(touch) - 接收触摸按下事件。touch 参数是 MotionEvent 类的对象。它返回 bool 如果为 True,则触摸事件的分发将停止。如果为 False,则事件将继续分发到部件树的其余部分。

  • on_touch_move(touch) - 接收触摸移动事件。触摸位于父级坐标中。

  • on_touch_up(touch) - 接收触摸抬起事件。触摸位于父级坐标中。

  • padding - 文本的填充:[padding_left, padding_top, padding_right, padding_bottom]。Padding 还接受两个参数形式 [padding_horizontal, padding_vertical] 和一个参数形式 [padding]。Padding 是一个 VariableListProperty,默认为 [6, 6, 6, 6]。

  • password - 如果为 True,则部件将显示其字符为 password_mask 中设置的字符集。

  • password_mask - 设置在 password 为 True 时用于屏蔽文本的字符。password_mask 是一个 StringProperty,默认为 '*'。

  • paste() - 将系统剪贴板中的文本插入到 TextInput 的当前光标位置。

  • readonly - 如果为 True,则用户将无法更改文本输入的内容。

  • select_all() - 选择此 TextInput 中显示的所有文本。

  • select_text(start, end) - 选择此 TextInput 中显示的一部分文本。参数为 start - textinput.text 的索引,从中开始选择,以及 end - textinput.text 的索引,到此结束选择。

  • selection_color - 选择的当前颜色,格式为 (r, g, b, a)。

  • selection_from - 如果正在进行或已完成选择,则此属性将表示选择开始时的光标索引。

  • selection_text - 当前内容选择。selection_text 是一个 StringProperty,默认为 '',只读。

  • tab_width - 默认情况下,每个制表符将在文本输入部件上替换为四个空格。您可以设置较低或较高的值。tab_width 是一个 NumericProperty,默认为 4。

  • text - 部件的文本。它是一个 AliasProperty。

用法

创建简单的 Hello World:

widget = TextInput(text='Hello world')

如果要使用 Unicode 字符串创建部件,请使用:

widget = TextInput(text=u'My unicode string')

当用户在 TextInput 部件中输入数据时,它将成为 text 属性的值。

当 TextInput 对象的 text 属性更改时,您可以调用回调函数。

def callback(instance, value):
   print('The widget', instance, 'have:', value)

textinput = TextInput()
textinput.bind(text=callback)

当 multiline 属性为 False 时,TextInput 接受单行输入。当用户按下 Enter 键时,将生成 on_text_validate 事件:

def callback(instance, value):
   print('The widget', instance, 'have:', value)
   
textinput = TextInput(multiline=False)
textinput.bind(on_text_validate=callback)

示例

让我们使用上面解释的 TextInput 类的某些属性和方法。在下面的示例中,我们在 BoxLayout 中布置了两个多行文本框和两个按钮。

“复制”按钮调用 gettext() 方法,该方法存储来自上部文本框的选择文本。

def gettext(self, instance):
   mydemoapp.text = self.text1.selection_text

“粘贴”按钮调用回调函数 insert(),该函数在光标位置粘贴选定的文本。

def insert(self, instance):
   self.text2.insert_text(mydemoapp.text)

这两个函数绑定到两个按钮:

self.b1=Button(text='COPY')
self.b1.bind(on_press=self.gettext)
self.b2=Button(text='PASTE')
self.b2.bind(on_press=self.insert)

build() 方法组装文本框和按钮。

以下是完整代码

from kivy.app import App
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.textinput import TextInput
from kivy.uix.button import Button
from kivy.config import Config

Config.set('graphics', 'width', '720')
Config.set('graphics', 'height', '300')
Config.set('graphics', 'resizable', '1')

class mydemoapp(App):
   text=''
   def gettext(self, instance):
      mydemoapp.text = self.text1.selection_text
   def insert(self, instance):
      self.text2.insert_text(mydemoapp.text)
      
   def build(self):
      main= BoxLayout(orientation= 'vertical')
      self.text1 = TextInput(multiline=True, font_size=20)
      btns = BoxLayout(orientation='horizontal')
      
      self.b1=Button(text='COPY')
      self.b1.bind(on_press=self.gettext)
      self.b2=Button(text='PASTE')
      self.b2.bind(on_press=self.insert)
      self.text2 = TextInput(
         multiline=True, font_size=20,
         foreground_color=[0,0,1,1]
      )
   
      btns.add_widget(self.b1)
      btns.add_widget(self.b2)
      main.add_widget(self.text1)
      main.add_widget(btns)
      main.add_widget(self.text2)
      return main
      
mydemoapp().run()

输出

Kivy Text Input
广告